在PHP中更正非法的PCRE正则表达式 更新5/26

在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

我已经修复了这个问题中先前包含的正则表达式的行为,但是正如其他人所提到的,我的语法仍然不正确。显然,它编译的原因是PHP的
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:是的,这是关于第一个正则表达式。你是什么意思,不允许你发布反斜杠?当然可以。我已经准备好了在阅读了你们的建议后,我用我现在使用的正则表达式来表示我的问题。你们能告诉我它们是否仍然是非法的吗?谢谢。