PHP Preg_match: попытка сопоставить строку, где подстрока не существует в строке - PullRequest
1 голос
/ 27 сентября 2010

Я пытался заставить эту работу регулярных выражений. Предположим, что для анализа URL-адреса, если найдена строка '_skipThis', не соответствует строка. Также необходимы обратные ссылки. Например:

String 1: a_particular_part_of_string/a/b/c/d/e/f
Result: preg_match should return true
Backreference: $1 -> a_particular_part_of_string, $2 -> /a/b/c/d/e/f

String 2: a_particular_part_of_string_skipThis/a/b/c/d/e/f
Result: preg_match should return false.
Backreference: nothing here.

Я пробовал следующее регулярное выражение ..

reg1 = ([a-zA-Z0-9_]+)(\/.*)
reg2 = ([a-zA-Z0-9]+(?!_skipThis))(\/.*)
reg3 = ((?!_skipThis).*)(\/.*)
reg4 = ((?!_skipThis)[a-zA-Z0-9_]+)(\/.*)

Пожалуйста, помогите мне! Заранее спасибо !!!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Попробуйте это:

$str1 = 'a_particular_part_of_string/a/b/c/d/e/f'; //1
$str2 = 'a_particular_part_of_string_skipThis/a/b/c/d/e/f'; //0
$keep = 'a_particular_part_of_string';
$skip = '_skipThis';

$m = array();
if(preg_match("/($keep)(?!$skip)(.*)$/", $str1, $m))
    var_dump($m);
else
    echo "Not found\n";

$m = array();
if(preg_match("/($keep)(?!$skip)(.*)$/", $str2, $m))
    var_dump($m);
else
    echo "Not found\n";

Вывод:

array(3) {
  [0]=>
  string(39) "a_particular_part_of_string/a/b/c/d/e/f"
  [1]=>
  string(27) "a_particular_part_of_string"
  [2]=>
  string(12) "/a/b/c/d/e/f"
}

Not found
0 голосов
/ 27 сентября 2010

Просто сопоставьте _skipThis и верните false , если оно найдено.

 if (strpos($theString, '_skipThis') === false) {
        // perform preg_match
 } else 
        return false;

(Конечно, для этого есть регулярное выражение. Предположим, _skipThis появляется только перед первым/,

 return preg_match('|^([^/]+)(?<!_skipThis)(/.*)$|', $theString); 
 //                   -------              -----
 //                     $1   --------------  $2
 //                          Make sure it is *not* preceded '_skipThis'

В противном случае, если необходимо избегать появления _skipThis в любом месте,

 return preg_match('|^(?!.*_skipThis)([^/]+)(/.*)$|', $theString);
 //                   ---------------
 //                   Make sure '_skipThis' is not found anywhere. 
...