我怎么捕获这个正则表达式的链接?

时间:2012-09-17 04:40:43

标签: php regex

我正在尝试使用相应的html标记分别替换图片链接,youtube视频链接和常规链接,并且我无法定位常规链接: 这是我的代码:

 function($text)
  {
    $output = preg_replace('#(http://([^\s]*)\.(jpg|gif|png))#', 
                        '<br/><img src="$1" alt="" width="300px" style = "clear:both;"/><br/>', $text);

        $output = preg_replace('#(http://([^\s]*)youtube\.com/watch\?v=([^\s]*))#', 
                      '<br/><iframe width="480px" height="385px" src="http://www.youtube.com/embed/$3"
                       frameborder="0" allowfullscreen style = "clear:both;"></iframe><br/>', $output);

    $output = preg_replace('#(http://([^\s]*)\.(com))#', 
                      '<br/><a href="$1">$1</a><br/>', $output);

    return $output

 }

相反,这是替换最后一步中的所有链接...我如何避免这种情况并在最后一步中仅替换链接(不是你的管或图像)?

谢谢!

2 个答案:

答案 0 :(得分:1)

您寻找的网址需要通过空格或新行等界定。只需将你的分隔符添加到正则表达式,所以最后一个正则表达式不是太贪心!例如...

<?php

$text = "
http://www.youtube.com/watch?v=yQ4TPIfCK9A&feature=autoplay&list=FLBIwq18tUFrujiPd3HLPaGw&playnext=1\n
http://www.asdf.com/asdf.png\n
http://www.asdf.com\n
";

var_export($text);
var_export(replace($text));

function replace($text)
{
    $output = preg_replace('#(http://([^\s]*)\.(jpg|gif|png))\n#', 
                        '<br/><img src="$1" alt="" width="300px" style = "clear:both;"/><br/>', $text);


    $output = preg_replace('#(http://([^\s]*)youtube\.com/watch\?v=([^\s]*))\n#', 
                      '<br/><iframe width="480px" height="385px" src="http://www.youtube.com/embed/$3"
                       frameborder="0" allowfullscreen style = "clear:both;"></iframe><br/>', $output);

    $output = preg_replace('#(http://([^\s]*)\.(com))\n#', 
                      '<br/><a href="$1">$1</a><br/>', $output);

    return $output;
}

答案 1 :(得分:0)

您可以使用preg_replace_callback仅匹配每个链接一次。因此,您不必担心两次修改链接:

$input = <<<EOM
http://www.example.com/fritzli.jpeg

https://www.youtube.com/watch?v=blabla+bla+"+bla

http://wwww.google.com/search?q=blabla
EOM;
echo replace($input);

function replace($text) {
    $output = preg_replace_callback("#(https?://[^\s]+)#", function($umatch) {
        $url = htmlspecialchars($umatch[1]);

        if(preg_match("#\.(jpg|jpeg|gif|png|bmp)$#i", $url)) {
            $result = "<br/><img src=\"$url\" alt=\"\" width=\"300px\" "
                . " style = \"clear:both;\"/><br/>";
        } elseif(preg_match("#youtube\.com/watch\?v=([^\s]+)#", $url, $match)) {
            $result = "<br/><iframe width=\"480px\" height=\"385px\""
                . " src=\"http://www.youtube.com/embed/{$match[1]}\""
                . " frameborder=\"0\" allowfullscreen style = \"clear:both;\">"
                . "</iframe><br/>";
        } else {
            $result = "<br/><a href=\"$url\">$url</a><br/>";
        }

        return $result;
    }, $text);

    return $output;
}

注意:上面的代码仅适用于PHP版本&gt; = 5.3。如果使用5.3或更低版本,则可以将内部函数提取到单独的函数中,并将函数名称作为参数提供给preg_replace_callback

function replace_callback($umatch) {
    $url = htmlspecialchars($umatch[1]);

    if(preg_match("#\.(jpg|jpeg|gif|png|bmp)$#i", $url)) {
        $result = "<br/><img src=\"$url\" alt=\"\" width=\"300px\" "
            . " style = \"clear:both;\"/><br/>";
    } elseif(preg_match("#youtube\.com/watch\?v=([^\s]+)#", $url, $match)) {
        $result = "<br/><iframe width=\"480px\" height=\"385px\""
            . " src=\"http://www.youtube.com/embed/{$match[1]}\""
            . " frameborder=\"0\" allowfullscreen style = \"clear:both;\">"
            . "</iframe><br/>";
    } else {
        $result = "<br/><a href=\"$url\">$url</a><br/>";
    }

    return $result;
}

function replace($text) {
    $output = preg_replace_callback("#(https?://[^\s]+)#",
        "replace_callback", // the name of the inner function goes here
        $text);

    return $output;
}