匹配并替换捕获/匹配的字符

时间:2014-07-12 12:31:32

标签: php regex

我目前有一个代码可以找到并将网址替换为完整的HTML链接。它工作正常,但现在我需要更新它,以便如果有图像网址,那么它应该将其转换为HTML img标记并显示它。现在使用的功能是......

function auto_link_text($text) {

   $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
   $callback = create_function('$matches', '
       $url       = array_shift($matches);
       $url_parts = parse_url($url);



       return sprintf(\'<a rel="nowfollow" target="_blank" href="%s">%s</a>\', $url, $url);
   ');

   return preg_replace_callback($pattern, $callback, $text);
}

从...得到它 How to add anchor tag to a URL from text input

以下是我要通过的文字示例......

asdf
http://google.com/
asfd
http://yahoo.com/logo.jpg
http://www.apple.com/sdfsd.php?page_id=13&id=18210&status=active#1
http://youtube.com/logo.png

喜欢更新输出功能......

asdf
<a rel="nowfollow" target="_blank" href="http://google.com/">http://google.com/</a>
asfd
<img src="http://yahoo.com/logo.jpg" class="example">
<a rel="nowfollow" target="_blank" href="http://www.apple.com/sdfsd.php?page_id=13&id=18210&status=active#1">http://www.apple.com/sdfsd.php?page_id=13&id=18210&status=active#1</a>
<img src="http://youtube.com/logo.png" class="example">

提前非常感谢!

2 个答案:

答案 0 :(得分:0)

Here是关于有效URL最合适的正则表达式模式的好文章。我从那里挑选了一个对所有网址进行分组。

Online demo

要遵循的步骤:

  1. 只需提取网址。
  2. 检查网址并根据您自己的逻辑替换标记,如演示文稿中所示。
  3. 示例代码:(获取组中的所有有效网址。从索引1获取)

    $re = "/(([A-Za-z]{3,9}:(?:\\/\\/)?(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)/";
    $str = "...";
    
    preg_match_all($re, $str, $matches); 
    

    示例代码:(替换锚标记(或者您想要添加的内容))

    $re = "/(([A-Za-z]{3,9}:(?:\\/\\/)?(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)/";
    $str = "...";
    $subst = '<a href="$1">$1</a>';
    
    $result = preg_replace($re, $subst, $str);
    

答案 1 :(得分:0)

您可以使用它,例如:

function create_anchor_tag($url, $text = false) {
    if ($text===false) $text = $url;
    return '<a rel="no-follow" target="_blank" href="' . $url . '">'
         . $text . '</a>'; 
}

function create_image_tag($url) {
    return '<img src="' . $url . '"/>';
}

function auto_link_text($text) {
    $pattern = '~\b(?:(?:ht|f)tps?://|www\.)\S+(?<=[\PP?])~i';

    $callback = function ($m) {
        $img_ext = array('jpg', 'jpeg', 'gif', 'png');
        $path = parse_url($m[0], PHP_URL_PATH);
        $ext = substr(strrchr($path, '.'), 1);

        if (in_array(strtolower($ext), $img_ext))
            return create_image_tag($m[0]);
        return create_anchor_tag($m[0]); 
    };

    return preg_replace_callback($pattern, $callback, $text);
}

我使用了几个函数来使它更清晰[rn],但你可以随意调整它。