正则表达式HREF选择不完整

时间:2011-11-22 13:51:43

标签: php regex

这是here上另一篇文章的后续内容。

问题:链接未完全用HREF包装,这意味着只有部分URL被链接标记包围。检测字符串上的链接的函数。

如果字符串包含http://t.co/thions43,则只返回链接标记中的http://t.co/thi部分。

<?php

function makeLink($match) {
    // Parse link.
     $substr = substr($match, 0, 6);
     if ($substr != 'http:/' && $substr != 'https:' && $substr != 'ftp://' && $substr != 'news:/' && $substr != 'file:/') {
        $url = 'http://' . $match;
     } else {
        $url = $match;
     }

     return '<a href="' . $url . '">' . $match . '</a>';
}
function makeHyperlinks($text) {
    // Find links and call the makeLink() function on them.
    return preg_replace('/((www\.|(http|https|ftp|news|file)+\:\/\/)[_.a-z0-9-]+\.[a-z0-9\/_:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])/e', "makeLink('$1')", $text);
}

?>

1 个答案:

答案 0 :(得分:1)

根据你的评论,你必须使你的正则表达式不敏感,你也可以简化:

return preg_replace('/((www\.|(http|https|ftp|news|file)+\:\/\/)[_.a-z0-9-]+\.[a-z0-9\/_:@=.+?,#%&~-]*[^.\'# !(?,><;\)])/ie', "makeLink('$1')", $text);

您也可以使用\w代替[a-zA-Z0-9_],并且不需要我标记:

'/((www\.|http|https|ftp|news|file):\/\/[\w.-]+\.[\w\/:@=.+?,#%&~-]*[^.\'"# !(?,><;\)])/e'