在PHP中更正非法的PCRE正则表达式 更新5/26
我已经修复了这个问题中先前包含的正则表达式的行为,但是正如其他人所提到的,我的语法仍然不正确。显然,它编译的原因是PHP的在PHP中更正非法的PCRE正则表达式 更新5/26,php,regex,preg-match,preg-match-all,pcre,Php,Regex,Preg Match,Preg Match All,Pcre,我已经修复了这个问题中先前包含的正则表达式的行为,但是正如其他人所提到的,我的语法仍然不正确。显然,它编译的原因是PHP的preg.*函数族忽略了我的错误 我绝对是一个PCRE新手,所以我试图了解存在哪些错误,以便我可以着手修复它们。我也对设计/方法持开放态度,正如其他人所提到的,我也将构建与JSON和YAML的兼容性,但我想继续并完成这个自制的解析器,因为我已经有了它,我只需要处理表达式语法(我想) 以下是从整个代码页中提取的所有preg\u match\u all参考和一个preg\u re
preg.*
函数族忽略了我的错误
我绝对是一个PCRE新手,所以我试图了解存在哪些错误,以便我可以着手修复它们。我也对设计/方法持开放态度,正如其他人所提到的,我也将构建与JSON和YAML的兼容性,但我想继续并完成这个自制的解析器,因为我已经有了它,我只需要处理表达式语法(我想)
以下是从整个代码页中提取的所有preg\u match\u all
参考和一个preg\u replace
参考:
// matches the outside container of objects {: and :}
$regex = preg_match_all('/\s\{:([^\}]+):\}/i', $this->html, $HTMLObjects);
// double checks that the object container is removed
$markup = preg_replace('/[\{:]([^\}]+):\}/i', '$1', $markup);
// matches all dynamic attributes (those containing bracketed data)
$dynamicRegEx = preg_match_all('/[\n]+([a-z0-9_\-\s]+)\[([^\]]+)\]/', $markup, $dynamicMatches);
// matches all static attributes (simple colon-separated attributes)
$staticRegEx = preg_match_all('/([^:]+):([^\n]+)/', $staticMarkup, $staticMatches);
如果您想在上下文中查看preg\u match\u all
和preg\u replace
引用,以便您也可以对其进行评论,您可以通过以下链接查看包含的源文件
注意:查看页面的源代码使所有内容都更具可读性
就像我说的,我让它按原样运行,我只是要求监督我的PCRE语法,这样它就不违法了。不过,如果您对结构/设计或其他方面有意见,我愿意接受所有建议。(重新编写以反映新问题)
第一个正则表达式是正确的,但不需要在字符类中转义}
。另外,我通常使用两个大括号来避免嵌套对象的匹配(您的正则表达式将匹配字符串{:foo{:bar:}
“{:foo{:bar:}baz:}”),我的将只匹配{:bar:}
。/I
模式修饰符是无用的,因为您的正则表达式中没有大小写文本
// matches the outside container of objects {: and :}
$regex = preg_match_all('/\s\{:([^{}]+):\}/', $this->html, $HTMLObjects);
在第二个正则表达式中,开头有一个不正确的字符类需要删除。否则,它是相同的
// double checks that the object container is removed
$markup = preg_replace('/\{:([^{}]+):\}/', '$1', $markup);
您的第三个正则表达式看起来不错;不过还有另一个无用的字符类。同样,我在否定字符类中包含了两个括号。我不确定您为什么要将其区分大小写-这里不应该有一个/I
修饰符吗
// matches all dynamic attributes (those containing bracketed data)
$dynamicRegEx = preg_match_all('/\n+([a-z0-9_\-\s]+)\[([^\[\]]+)\]/i', $markup, $dynamicMatches);
最后一个正则表达式是可以的,但它将始终从字符串的第一个字符匹配到第一个冒号(然后再匹配到行的其余部分)。我想我会在第一个被否定的字符类中添加一个换行符,以确保不会发生这种情况:
// matches all static attributes (simple colon-separated attributes)
$staticRegEx = preg_match_all('/([^\n:]+):([^\n]+)/', $staticMarkup, $staticMatches);
它不在字符类的内部,那些是捕获组之前的文字括号,除非你引用了其他内容。所以我没有发布转义斜杠,但你是在谈论第一个正则表达式吗?@danL:是的,这是关于第一个正则表达式。你是什么意思,不允许你发布反斜杠?当然可以。我已经准备好了在阅读了你们的建议后,我用我现在使用的正则表达式来表示我的问题。你们能告诉我它们是否仍然是非法的吗?谢谢。