2011-03-31 39 views
1

我被困在PHP中解析包含键值对与运算符之间的字符串(如下所示)。我打算用用户正则表达式来解析它(尽管我不擅长)。在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 - (&|)只需指示'AND'或'OR'。

可以有多个块嵌套在凹口()中。

从马特受到启发我已经使用了下面的正则表达式。

 
$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:字符串:oneChar但我仍然得到同样的错误。 因此,我觉得在oneChar reg前例中有问题。请帮助我解决这个问题。

+1

切勿使用正则表达式进行解析! – 2011-03-31 16:38:27

+1

因为你可以[有这样的故障SO用户](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 – gideon 2011-03-31 16:42:48

+0

Hi @ SK-logic和@giddy,由于这是我第一次与解析工作,我不知道使用不同的方法。我很想知道其他解析方法。 – Goje87 2011-03-31 18:17:14

回答

0

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

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

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

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

+0

嘿,尼克,好发现... :)正斜杠是罪魁祸首。但问题不是它没有逃脱。相反,它是传递给preg_match的字符串。它也有'/'作为分隔符,因此它与$ regs [':oneChar']中的'/'冲突。我将分隔符更改为'@',它工作正常。 – Goje87 2011-03-31 18:44:38

+0

我编辑了您的答案,以提供正确的错误原因。 – Goje87 2011-03-31 18:50:56