2010-12-11 90 views
0

如果语句匹配模板条件。问题在于在将条件语句分解为单个条件之前解析出字符串。正则表达式:匹配字符串时不会通过匹配字符串中间的转义引号来匹配匹配字符串

我在条件分解之前用占位符替换了字符串条件,所以字符串不会干扰分解模式匹配。

下面的代码是否正常工作。

// remove quoted strings from conditional elements as will conditional tokenising below 
if (preg_match_all('/([\"\'])([^\\1]*?)\\1/s', $conditions, $string_matches)) 
{ 
    $uid = uniqid(time().'_'); 
    $strings = array(
      'id' => $uid, 
      'matches' => array() 
     ); 
    $replacements = array(); 
    foreach($string_matches[0] as $key=>$match) 
    { 
     $match_id = '#'.$uid.md5($match); 
     $replacements[$match] = $match_id; 
     $strings['matches'][$match_id] = array(
       'match' => $match, 
       'content' => $string_matches[2][$key], 
      ); 
    } 
    $conditions = str_replace(array_keys($replacements), array_values($replacements), $conditions); 
} 

它匹配以下强大

boolean_arg1 && arg2 !== 'testing multi quotes' && arg3 === "test & yup" -or- 
boolean_arg1 && arg2 !== 'testing "multi" quotes' && arg3 === "test & yup" 

给我

boolean_arg1 && arg2 !== #1292059008_4d0341809c0f74062e5ac5086fb24f8e8383a137a5a5e && arg3 === #1292059008_4d0341809c0f7d4820850f1f6e06677e741be556352e3 
boolean_arg1 && arg2 !== #1292059102_4d0341de3f5196213c34e77a2cfbb11f867f9ed57c85f && arg3 === #1292059102_4d0341de3f519d4820850f1f6e06677e741be556352e3 

但引入转义引号为字符串,打破在转义字符串的模式匹配。

boolean_arg1 && arg2 !== 'testing "multi" \'quotes' && arg3 === "test && yup" 

给人的第一置换后

boolean_arg1 && arg2 !== #1292059161_4d03421974c3166a7cae87ddc1002905892eff6453bd4quotes' && arg3 === #1292059161_4d03421974c31d4820850f1f6e06677e741be556352e3 

(注意引号)。

我不擅长做查找等。我想知道是否有一个简单的解决方案将上面的代码中的正则表达式转换为与其中的转义引号匹配的完整字符串?

回答

1

使用反映逸出样序列的图案:

/"(?:[^"\\]*|\\["\\])*"|'(?:[^'\\]*|\\['\\])*'/ 

利用该唯一的\\\"\'分别是已知的转义序列。您可以通过更改["\\]/['\\]来扩展它们。

+0

那个正则表达式会抛出一个编译错误?我虽然是这样的:[但是逃脱了它不起作用。不知道为什么。 – buggedcom 2010-12-11 10:07:39

+0

@buggedcom:确保正确地转义字符串中的'\'和引号。 – Gumbo 2010-12-11 11:53:01