2010-03-18 53 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

相关问题