preg_replace不会创建链接


preg_replace wont create links

嗨,我对这个叫做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 属性。

RegExp 匹配项由模式中()定义的子模式划分。因此,对于模式中的每个子模式,您将获得部分匹配。第一盘是整场比赛,第二盘是第一(expr)...等。所以 $0 = 完全匹配的字符串。$1 = 'http' 或 'https' 或 'ftp' 或 'ftps', $2 = '(/''S*)'。

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

首先,在替换之前测试字符串是否与您的模式匹配是没有用的......如果字符串不匹配,则 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://)。如果这是一个真实的例子,你的正则表达式永远不会匹配这个字符串......