preg_match должен заканчиваться на "/"? - PullRequest
0 голосов
/ 12 февраля 2011

В 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 голосов
/ 12 февраля 2011

Вы должны просто использовать 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)
0 голосов
/ 12 февраля 2011

Вы должны сначала удалить косую черту и добавить '/?' в конце вашего регулярного выражения

$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])))
0 голосов
/ 12 февраля 2011

Это выстрел в темноте, но попробуйте:

preg_match( '/' . preg_quote( get_bloginfo('url'), '/' ) . '?/', $matches[0][$i] )

Вы можете использовать любой символ вместо /. Я предполагаю, что вы используете WordPress и предполагаю, что get_bloginfo('url') нормализовано, чтобы всегда иметь косую черту. Если это так, то последний слэш будет выбран опционально ? в конце регулярного выражения.

0 голосов
/ 12 февраля 2011

~^http://somefolder/go(?:/|$)~

...