Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用正则表达式解析块_Php_Regex_Parsing_Preg Match - Fatal编程技术网

在PHP中使用正则表达式解析块

在PHP中使用正则表达式解析块,php,regex,parsing,preg-match,Php,Regex,Parsing,Preg Match,我一直在用PHP解析包含键值对的字符串,键值对之间有运算符(如下所示)。我计划使用regex来解析它(尽管我并不擅长) key:“value”&key2:“value2”| title:“something\”here\“…”和(key:“这个值在妄想中”| key:“另一个值”) 基本上,上述模块中的单位如下所示 键-任何符合javascript变量条件的内容 值-任何长或短但用双引号(“”)括起的字符串 pair-(key:value)一个由冒号组合的键和值,就像在javascript对象中

我一直在用PHP解析包含键值对的字符串,键值对之间有运算符(如下所示)。我计划使用regex来解析它(尽管我并不擅长)

key:“value”&key2:“value2”| title:“something\”here\“…”和(key:“这个值在妄想中”| key:“另一个值”)

基本上,上述模块中的单位如下所示

  • -任何符合javascript变量条件的内容
  • -任何长或短但用双引号(“”)括起的字符串
  • pair
    -(
    key:value
    )一个由冒号组合的键和值,就像在javascript对象中一样
  • 运算符
    -(
    &
    |
    )仅指示“和”或“或”
  • prantheses
    中可以嵌套多个块

    灵感来自马特(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); } $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[':运算符']=“(&| \|”)”; $regs[':pair']=“({$regs[':key']}\s*:)?\s*{$regs[':value']}”; if(preg_match(“/^{$regs[':value']}/”,$query,$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()[function.preg match]:第23行/home/xxxx/test.xxxx.com/experiments/regex/index.php中的未知修饰符“\” 我尝试使用:string和:oneChar进行preg_匹配,但仍然出现相同的错误。
    因此,我觉得:oneChar reg ex中有一些错误。请帮助我解决这个问题。

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

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

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

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

    永远不要使用正则表达式进行解析!因为您可以。您好@SK logic和@giddy,因为这是我第一次使用解析,我不知道使用了不同的方法。我很想知道另一种方法是什么有很多PHP解析器生成器,包括Hey Nick,good find…:)正斜杠是罪魁祸首。但问题不是它没有被转义。而是传递给preg_匹配的字符串。它还有“/”作为分隔符,因此它与$regs[”:oneChar']中的“/”冲突.我将分隔符改为@,效果很好。