嗨,这个函数叫做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属性的原因。
答案 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 *)'。
因此,您需要将正确的表达部分放入()
,并在替换字符串中给出正确的数字。