preg_replace不会创建链接

时间:2013-11-03 22:27:31

标签: php

嗨,这个函数叫做post_link($ str)

<?php        
function post_link($str)
{
    if(preg_match("#(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?#",$str,$url)){

    return preg_replace("#(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?#","<a href='$0'>$0</a>",$str);
    } 
    else
    {
        return $str;
    }
}      

?>

它不会像我希望的那样创建链接吗?

这就是我想要创建此链接的​​链接时所做的事情:

youtube.com/watch?v=4EvNxWhskf8 

结果就是这个

href='http://youtube.com/watch?v=4EvNxWhskf8'>youtube.com/watch?v=4EvNxWhskf8 

可能导致这种情况发生的原因请帮忙。出现href属性的原因。

2 个答案:

答案 0 :(得分:0)

首先,在替换之前测试字符串是否与您的模式匹配是没有用的...如果您的字符串不匹配,则preg替换不会替换。

这就够了:

function post_link ($str){
    return preg_replace("...", $str)
}

调试起来会更容易。

然后,这是我的测试:

[ ~]$ cat script.php 
#!/usr/bin/php
<?php
    echo preg_replace("#(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?#","<a href='$0'>$0</a>", $argv[1]) . "\n";
?>
[ ~]$ ./script.php "http://youtube.com/watch?v=4EvNxWhskf8"
<a href='http://youtube.com/watch?v=4EvNxWhskf8'>http://youtube.com/watch?v=4EvNxWhskf8</a>
[ ~]$ 

似乎预期的结果,不是吗?因此,您必须调试更多(例如,使用调试器(例如xdebug)检查变量)。否则,您应该向我们提供有关您的代码,输出的更多详细信息......

此外,我注意到您的链接示例不包含协议(例如http://)。如果这是一个真实的例子,你的正则表达式永远不会匹配这个字符串...

答案 1 :(得分:0)

RegExp匹配除以在模式中使用()定义的子模式。因此,对于模式中的每个子模式,您将获得部分匹配。集合中的第一个匹配是完全匹配,第二个匹配是第一个(expr) ...等等所以$ 0 =完全匹配的字符串。 $ 1 ='http'或'https'或'ftp'或'ftps',$ 2 ='(/ \ S *)'。

因此,您需要将正确的表达部分放入(),并在替换字符串中给出正确的数字。