0

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

4

2 回答 2

0

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

这就够了:

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://例如)。如果这是一个真实的例子,你的正则表达式永远不会匹配这个字符串......

于 2013-11-03T22:33:59.260 回答
0

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

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

于 2013-11-03T22:35:13.380 回答