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