Autor | Zpráva | ||
---|---|---|---|
gully Profil |
#1 · Zasláno: 22. 3. 2011, 19:22:58
Zdravim,
chtel bych poprosit o pomoc s regularnim vyrazem pro detekci hypertextoveho odkazu v textu, pro ktery pouzivam nasledujici funkci z phpBB2. function make_clickable($text) { $text = preg_replace('#(script|about|applet|activex|chrome):#is', "\\1:", $text); // pridame mezeru aby sel porovnavat text na zacatku prvniho radku $ret = ' ' . $text; // najde "xxxx://yyyy" URL na zacatku radku nebo za mezerou // xxxx mohou byt jen alfa znaky // yyyy je cokoliv az k prvni mezere, odradkovani, carce, uvozovce nebo mene nez $ret = preg_replace("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $ret); // najde "www|ftp.xxxx.yyyy[/zzzz]" url // musi obsahovat alespon dve tecky...xxxx obsahuje alfanumericke znaky nebo - // zzzz je volitelne..opet cokoliv az k prvni mezere, odradkovani, carce, uvozovce nebo mene nez $ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $ret); // najde email@domena adresu na zacatku radku nebo po mezere // platne znaky; alfanumericke, "-", "_" a,nebo ".". $ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret); // odstranit mezeru na zacatku.. $ret = substr($ret, 1); return($ret); } Funguje to bezvadne, az na jednu malickost, a sice ze pokud je za odkazem tecka nebo carka (mozna je toho vic, nezkousel jsem), tak ji to do odkazu zahrne taky, a tim padem je tento odkaz neplatny. Nevite, jak opravit ten regulerni vyraz tak, aby to bylo OK? Nasel jsem reseni tady, ale ptz nejsem phpkar, nedokazu ho prepsat do php kodu. |
||
Darker Profil |
#2 · Zasláno: 23. 3. 2011, 12:00:41 · Upravil/a: Darker
$text =preg_replace ("~((http://)|(www\.))([^ ]+[^,. ])~",'<a href="http://$3$4">$2$3$4</a>',$text;) |
||
gully Profil |
#3 · Zasláno: 23. 3. 2011, 13:17:38
ahoj, diky moc. davam do placu jeste jednu variantu:
function make_clickable($text){ // match protocol://address/path/ $text = preg_replace_callback("#(^| |\n)([a-zA-Z]+://)([.]?[?=&a-zA-Z0-9_/-])*#", create_function('$part', '$text_link = (strlen($part[0]) > 19) ? substr($part[0],0,14) . "..." . substr($part[0],-2) : $part[0]; return $part[1] . "<a href=\"{$part[0]}\" title=\"Odkaz: {$part[0]}\" target=\"_blank\">{$text_link}</a>";') , $text); // match http://www.something //added |\n so catches new lines as well and not links in the [url=...] tags or in quotes $text = preg_replace_callback("#(^| |\n)(www([.]?[?=&a-zA-Z0-9_/-])*)#", create_function('$part', '$text_link = (strlen($part[2]) > 15) ? substr($part[2],0,10) . "..." . substr($part[2],-2) : $part[2]; return $part[1] . "<a href=\"http://{$part[2]}\" title=\"Odkaz: http://{$part[2]}\" target=\"_blank\">{$text_link}</a>";') , $text); // return $text return $text; } |
||
Časová prodleva: 14 let
|
0