2010-03-18 49 views
1

我到我的脖子正則表達式,我有這樣的正則表達式,在JavaScript(和閃存)的作品,我只是不能在PHP轉換的Javascript正則表達式PHP(PCRE)表達

工作

這就是:

var number 
     = '(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)'; 
    var oneChar = '(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]' 
     + '|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))'; 
    var str = '(?:\"' + oneChar + '*\")'; 
    var varName = '\\$(?:' + oneChar + '[^ ,]*)'; 
    var func = '(?:{[ ]*' + oneChar + '[^ ]*)'; 
    // Will match a value in a well-formed JSON file. 
    // If the input is not well-formed, may match strangely, but not in an unsafe 
    // way. 
    // Since this only matches value tokens, it does not match whitespace, colons, 
    // or commas. 
    var jsonToken = new RegExp(
     '(?:false|true|null' 
     +'|[\\}]' 
     + '|' + varName 
     + '|' + func 
     + '|' + number 
     + '|' + str 
     + ')', 'g'); 

如果你想在這裏它完全組裝是:

/(?:false|true|null|[\}]|\$(?:(?:[^\0-\x08\x0a-\x1f"\\]|\\(?:["/\\bfnrt]|u[0-9A-Fa-f]{4}))[^ ,]*)|(?:{[ ]*(?:[^\0-\x08\x0a-\x1f"\\]|\\(?:["/\\bfnrt]|u[0-9A-Fa-f]{4}))[^ ]*)|(?:-?\b(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b)|(?:"(?:[^\0-\x08\x0a-\x1f"\\]|\\(?:["/\\bfnrt]|u[0-9A-Fa-f]{4}))*"))/g 

有趣的是,它非常類似於JSON。

我需要這樣的正則表達式在PHP工作...

下面是我在PHP:

$number = '(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)'; 
    $oneChar = '(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))'; 
    $string = '(?:\"'.$oneChar.'*\")'; 
    $varName = '\\$(?:'.$oneChar.'[^ ,]*)'; 
    $func = '(?:{[ ]*'.$oneChar.'[^ ]*)'; 

    $jsonToken = '(?:false|true|null' 
     .'|[\\}]' 
     .'|'.$varName 
     .'|'.$func 
     .'|'.$number 
     .'|'.$string 
     .')'; 

    echo $jsonToken; 

    preg_match_all($jsonToken, $content, $out); 

    return $out; 

這裏,如果我嘗試使用preg_match_all()會發生什麼:

警告:preg_match_all() [function.preg-match-all]:編譯 失敗:沒有重複的偏移量0 在線88

任何幫助將不勝感激!

謝謝, 馬特

回答

2

我想這是因爲你沒有你的正則表達式在分隔符之間。

嘗試:

$jsonToken = '@(?:false|true|null' 
     .'|[\\}]' 
     .'|'.$varName 
     .'|'.$func 
     .'|'.$number 
     .'|'.$string 
     .')@'; 
+0

就像一個魅力!太好了,謝謝! – Matt 2010-03-18 06:51:00

2

preg,需要在圖案,例如定界符您使用它作爲

preg_match_all('#[a-z]+#i', ....); // # is the delimiter, i means case-insensitive. 

嘗試添加它們,看看是否還有任何錯誤。

+0

感謝您的答覆,無論是工作,所以我就用誰第一個回答,抱歉 – Matt 2010-03-18 06:51:42

相關問題