Autor Zpráva
Niik
Profil *
Mám php funkci, která mění url na odkazy. Ale mám problém, když se v řetězci, v kterém mají být převedené url na odkazy objeví například obrázek ve formátu: <img src="http://somelink.com/picture.jpg"> tak to také převede url v src na odkaz. Jak by se tomu dalo vyhnout?

Funkce
<?php
$string='<img src="http://somelink.com/img.jpg"> http://somelink.com';
echo makelink($string);

function makeLink($string){

$string = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i","$1http:$2",$string);
$string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</A>",$string);
$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<A HREF=\"mailto:$1\">$1</A>",$string);

return $string;
}

?>

Ještě malí příklad když mám řetězec:

<img src="http://somelink.com/img.jpg"> http://somelink.com

Jak by měl dopadnout výsledek:

<img src="http://somelink.com/img.jpg"> <a href="http://somelink.com" target="_blank">http://somelink.com</a>

Co dělá funkce teď:

<img src="<a href="http://somelink.com/img.jpg" target="_blank">http://somelink.com/img.jpg</a>"> <a href="http://somelink.com" target="_blank">http://somelink.com</a>

Doufám, že jsem vysvětlil dostatečně svůj problém.
lionel messi
Profil
Som len amatér, môže tam byť chyba, ale chcem pomôcť, skúsim niečo zosmoliť:

V tomto stave to obrázky neprevedie vôbec, ešte skúsim porozmýšľať nad tým, aby ich previedlo tak, ako treba.
$string = preg_replace("/([^\w\/])(<! src=[^\"])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i","$1http:$2",$string);
$string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</A>",$string);
$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<A HREF=\"mailto:$1\">$1</A>",$string);

Tak to nefunguje, veľmi sa ospravedlňujem…
Tori
Profil
Niik:
Jde zřejmě jen o ta první dvě nahrazení. U prvního přidáte omezení, že znaky před "www" nebudou obsahovat uvozovku/apostrof, u druhého upřesníte protokol. Píšu taky z hlavy.
$string = preg_replace("/([^\w\"'\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i","$1http:$2",$string);
$string = preg_replace("/((?:https?|ftp):\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</A>",$string);
lionel messi
Profil
Tori:
Dnes som testol vaše riešenie, správna odpoveď ma totiž veľmi zaujíma (možno ešte viac než Niika :-)). Zdá sa, že funguje, keď sú reguláry v nasledovnej podobe (chytilo sa to až po pridaní vyznačenej asercie do vášho druhého reguláru:

$string = preg_replace("/([^\w\"'\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i","$1http:$2",$string);
$string = preg_replace("/(?<! src=\")((?:https?|ftp):\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</A>",$string);
$string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<A HREF=\"mailto:$1\">$1</A>",$string);
Tori
Profil
lionel messi:
Jasně, zapomněla jsem, dík. Možná by stačila v aserci jen uvozovka+apostrof (pro jiné atributy než jen src).
Niik
Profil *
lionel messi:
Tvoje řešení funguje zatím bez problému, děkuji.

Nestačilo by ale jenom pohlídat že před začátkem url musí být mezera?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: