Autor Zpráva
gully
Profil
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
$text =preg_replace ("~((http://)|(www\.))([^ ]+[^,. ])~",'<a href="http://$3$4">$2$3$4</a>',$text;)
gully
Profil
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;
    }

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: