1

更新 5/26

我已经修复了此问题中先前包含的正则表达式的行为,但正如其他人所提到的,我的语法仍然不正确。显然它编译的事实是由于 PHP 的preg_*函数家族忽略了我的错误。

我绝对是 PCRE 新手,所以我试图了解存在哪些错误,以便我可以着手修复它们。我也愿意对设计/方法进行批评,正如其他人所提到的,我还将构建与 JSON 和 YAML 的兼容性,但我想继续完成这个自制的解析器,因为我有了它工作,我只需要处理表达式语法(我认为)。

以下是从整页代码中提取的所有preg_match_all参考和一个参考:preg_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_match_allpreg_replace引用,以便您也可以评论/批评,您可以通过以下链接查看包含的源文件。

注意:查看页面的源代码会使所有内容更具可读性 http://mdl.fm/codeshare.php?htmlobject

就像我说的,我让它按原样运行,我只是要求对我的 PCRE 语法进行监督,这样它就不是非法的。但是,如果您对结构/设计或其他任何内容有意见,我愿意接受所有建议。

4

1 回答 1

3

(重写以反映新问题)

第一个正则表达式是正确的,但您不需要}在字符类中转义。此外,我通常包含两个大括号以避免匹配嵌套对象(您的正则表达式将匹配{:foo {:bar:}string "{: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);
于 2013-05-25T20:54:33.353 回答