Autor Zpráva
wer
Profil *
Zdravim,

mám naprogramovanou diskusi ale ještě bych potřeboval vědět jak udělat když něco začíná na http:// nebo
www jak z toho udělat odkaz.
Pavel Strejček
Profil
Nejlépe regulárním výrazem.

Například:

$text = 'abc http://www.example.cz/ efg';
$text = preg_replace_callback('~((https?|ftp)://\S{4,40})\S*~',
create_function(
'$match',
'return " <a href=\"$match[0]\">$match[1]" . ($match[0] != $match[1] ? "..." : "") . "</a>";'
),
$text);
echo $text;


Dá se to samozřejmě ještě zdokonalit, kontrolovat jenom platné URL apod.
wer
Profil *
a jak se kontroluje platné URL?
Pavel Strejček
Profil
Ještě bych doplnil, že v praxi může být u tothoto skriptu problém s tím, že se preg_replace_callback použije na řetězci ošetřeném pomocí htmspecialchars, takže může dojí k rozpůlení entity, proto je dobré to udělat nějak takto:

$text = preg_replace_callback('~((https?|ftp)://\S{4,40})\S*~',

create_function(

'$match',
'$possiblyLastEntity = strrpos($match[1], "&");
$match[1] = $possiblyLastEntity === false ? $match[1] : substr($match[1], 0, $possiblyLastEntity);
return " <a href=\"$match[0]\">$match[1]" . ($match[0] != $match[1] ? "..." : "") . "</a>";'

),

$text);
Pavel Strejček
Profil
wer
a jak se kontroluje platné URL?

Regulární výraz pro syntaktickou správnost URL:

'/^((http|https|ftp)\:\/\/([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.\&\%\$\-]+)* @)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25 [0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5] |2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0- 4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a -zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?\/?(\/[^\/][a-zA-Z0-9\.\,\?'\\ /\+\&\%\$#\=~_\-@]*)*)?$/'


Zakomponovat do funkce si ho už musíš sám. :-)
Pavel Strejček
Profil
Trochu se to poškodilo při vkládání. Ty mezery tam nemají být.
Toto téma je uzamčeno. Odpověď nelze zaslat.