在下面的preg_match中,我正在比较两个静态字符串,$ url和$ my_folder ......
$url = get_bloginfo('url')
//$url = 'http://site.com'
$my_folder = get_option('my_folder');
//$my_folder = 'http://site.com/somefolder;
当$ my_folder字符串有一个尾部斜杠
时,我得到一个匹配项 http://somefolder/go/
但这不会创造一场比赛......
http://somefolder/go
然而,另一个问题是这也匹配......
http://somefolder/gone
代码是......
$my_folder = get_option('rseo_nofollow_folder');
if($my_folder !=='') $my_folder = trim($my_folder,'/');
$url = trim(get_bloginfo('url'),'/');
preg_match_all('~<a.*>~isU',$content["post_content"],$matches);
for ( $i = 0; $i <= sizeof($matches[0]); $i++){
if($my_folder !=='')
{
//HERES WHERE IM HAVING PROBLEMS
if ( !preg_match( '~nofollow~is',$matches[0][$i])
&& (preg_match('~' . $my_folder . '/?$~', $matches[0][$i])
|| !preg_match( '~'. $url .'/?$~',$matches[0][$i])))
{
$result = trim($matches[0][$i],">");
$result .= ' rel="nofollow">';
$content["post_content"] = str_replace($matches[0][$i], $result, $content["post_content"]);
}
}
else
{
//THIS WORKS FINE, NO PROBLEMS HERE
if ( !preg_match( '~nofollow~is',$matches[0][$i]) && (!preg_match( '~'.$url.'~',$matches[0][$i])))
{
$result = trim($matches[0][$i],">");
$result .= ' rel="nofollow">';
$content["post_content"] = str_replace($matches[0][$i], $result, $content["post_content"]);
}
}
}
return $content;
答案 0 :(得分:0)
~^http://somefolder/go(?:/|$)~
答案 1 :(得分:0)
您需要先删除尾部斜杠并添加'/?'在正则表达式结束时
$my_folder = trim($my_folder,'/');
$url = trim(get_bloginfo('url'),'/');
if ( !preg_match( '~nofollow~is',$matches[0][$i])
&& (preg_match('~' . $my_folder . '/?$~', $matches[0][$i])
|| !preg_match( '~'. $url .'/?$~',$matches[0][$i])))
答案 2 :(得分:0)
这是黑暗中的镜头,但请尝试:
preg_match( '/' . preg_quote( get_bloginfo('url'), '/' ) . '?/', $matches[0][$i] )
您可以使用您想要的任何字符代替/
字符。我猜你正在使用wordpress并猜测get_bloginfo('url')
被规范化以总是有一个尾随斜杠。如果是这种情况,最后一个斜杠将由正则表达式末尾的?
选择。
答案 3 :(得分:0)
如果它是固定字符串,你应该使用strstr()
或strpos()
。
您的示例已重写:
if (!strstr($matches[0][$i], "nofollow")
and strstr($matches[0][$i], $my_folder)
or !strstr($matches[0][$i], $url) )
strpos的工作方式类似,但您需要额外的布尔检查:
if (strpos($matches, "nofollow") === FALSE
or strpos($matches, $my_folder) !== FALSE)