【问题标题】:Parsing Blocks with Regular Expression in PHP在 PHP 中使用正则表达式解析块
【发布时间】:2011-03-31 16:35:53
【问题描述】:

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

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 - (&|)简单地表示“与”或“或”。

() 中可以嵌套多个块。

受到 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条件附近抛出错误

警告:preg_match() [function.preg-match]:第 23 行 /home/xxxx/test.xxxx.com/experiments/regex/index.php 中的未知修饰符 '\'

我尝试使用 :string 和 :oneChar 进行 preg_match ,但仍然出现相同的错误。 因此,我觉得 :oneChar reg ex 有问题。请帮我解决这个问题。

【问题讨论】:

  • 永远不要使用正则表达式进行解析!
  • 嗨@SK-logic 和@giddy,由于这是我第一次使用解析,我不知道用于它的不同方法。我很想知道还有哪些其他有利于解析的方法。
  • PHP的解析器生成器有很多,包括github.com/maetl/php-peg

标签: php regex parsing preg-match


【解决方案1】:

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

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

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

除此之外,我会一次运行一个正则表达式,看看哪个正则表达式引发了错误。

【讨论】:

  • 嘿尼克,很好的发现... :) 正斜杠是罪魁祸首。但问题不在于它没有逃脱。相反,它是传递给 preg_match 的字符串。它也有 '/' 作为分隔符,因此它与 $regs[':oneChar'] 中的 '/' 冲突。我将分隔符更改为“@”,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2011-06-03
相关资源
最近更新 更多