2010-09-27 137 views
1

我一直在试图获得这个正则表达式的工作。假设解析URL,如果找到字符串'_skipThis',则不匹配字符串。反向引用也是需要的。例如:PHP Preg_match:尝试匹配字符串中不存在子串的字符串

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_]+)(\/.*) 

请帮帮我!提前致谢!!!

回答

0

只匹配_skipThis并返回如果找到。

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. 
0

试试这个:

$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) "https://stackoverflow.com/a/b/c/d/e/f" 
} 

Not found 
+0

非常感谢你的帮助。 “a_particular_part_of_string”的含义是不一样的。谢谢! – 2010-09-27 16:18:28