在PHP中使用正则表达式解析块
我一直在用PHP解析包含键值对的字符串,键值对之间有运算符(如下所示)。我计划使用regex来解析它(尽管我并不擅长)在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对象中
key:“value”&key2:“value2”| title:“something\”here\“…”和(key:“这个值在妄想中”| key:“另一个值”)
基本上,上述模块中的单位如下所示
键
-任何符合javascript变量条件的内容值
-任何长或短但用双引号(“”)括起的字符串李>
pair
-(key:value
)一个由冒号组合的键和值,就像在javascript对象中一样运算符
-(&
或|
)仅指示“和”或“或”(
和)
中可以嵌套多个块
灵感来自马特(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']中的“/”冲突.我将分隔符改为@,效果很好。