preg_match必须以“/”结尾?

时间:2011-02-11 21:05:17

标签: php preg-match

在下面的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;

4 个答案:

答案 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)