用PHP中的正则表达式解析块

时间:2011-03-31 16:35:53

标签: php regex parsing preg-match

我很难解析包含键值对的字符串,其中包含PHP中的运算符(如下所示)。我打算使用正则表达式来解析它(虽然我不擅长)。

key: "value" & key2 : "value2" | title: "something \"here\"..." &( key: "this value in paranthesis" | key: "another value")

基本上,上述区块中的单位如下

  1. key - 任何有资格成为javascript变量的内容。
  2. value - 任何长或短的字符串,但用双引号括起来(“”)。
  3. pair - (key:value)冒号的键和值,就像在javascript对象中一样。
  4. operator - (&|)只需指出“与”或“或”。
  5. 可以在prantheses ()中嵌套多个块。

    受到Matt的启发(http://stackoverflow.com/questions/2467955/convert-javascript-regular-expression-to-php-pcre-expression)我使用了以下正则表达式。

    $regs[':number'] = '(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)';
    $regs[':oneChar'] = '(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
    $regs[':string'] = '(?:\"'.$regs[':oneChar'].'*\")';
    $regs[':varName'] = '\\$(?:'.$regs[':oneChar'].'[^ ,]*)';
    $regs[':func'] = '(?:{[ ]*'.$regs[':oneChar'].'[^ ]*)';
    $regs[':key'] = "({$regs[':varName']})";
    $regs[':value'] = "({$regs[':string']})";
    $regs[':operator'] = "(&|\|)";
    $regs[':pair'] = "(({$regs[':key']}\s*:)?\s*{$regs[':value']})";
    
    if(preg_match("/^{$regs[':value']}/", $query, $matches))
    {
      print_r($matches);
    }
    

    执行上述操作时,PHP会在IF条件附近抛出错误

    Warning: preg_match() [function.preg-match]: Unknown modifier '\' in /home/xxxx/test.xxxx.com/experiments/regex/index.php on line 23
    

    我试过preg_match:string和:oneChar但我仍然得到同样的错误。 因此我觉得有一些问题:oneChar reg ex。请帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

我在第二个正则表达式中看到至少一个错误($ regs [':oneChar'])。它有一个正斜杠。它与preg_match中用作分隔符的正斜杠相冲突。请改用preg_match("@^{$regs[':value']}@", $query, $matches)

您可能还需要在输入字符串上使用preg_quote。

$query = preg_quote($query, '/');

除此之外,我会一次运行一个正则表达式,以查看哪一个正在抛出错误。