2011-03-31 36 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