【发布时间】:2011-03-31 16:35:53
【问题描述】:
我一直在解析包含键值对的字符串,其中包含运算符(如下所示)。我打算用正则表达式来解析它(虽然我不擅长)。
key: "value" & key2 : "value2" | title: "something \"here\"..." &( key: "this value in paranthesis" | key: "another value")
上面区块中的单位基本如下
-
key- 任何有资格成为 javascript 变量的东西。 -
value- 任何长或短但用双引号 ("") 括起来的字符串。 -
pair- (key:value) 用冒号组合的键和值,就像在 javascript 对象中一样。 -
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