我混合了html,自定义代码和常规文本,我需要在几个长维基页面上经常检查和更改。我正在使用类似wiki的专有应用程序,无法控制应用程序如何运行或验证用户输入。用户添加的页面布局必须遵循非常特定的标准布局,并且始终仅在特定位置包含非常特定的文本 - 经常更改的标准。如果用户添加的页面远远超出标准,则会删除它们。
我没有资源手动校对和纠正所有这些页面,因此自动化是唯一的解决方案。事实上所有这些显然完全是浪费时间,因为已经可以理解替代平台完全按照这里所需要做的事情。
我已经构建了一个基于PHP的API,以便为我自动执行此后验证和频繁的重新标准化过程。我已经能够设置正则表达式模式来处理所有这些混合文本,它们都可以很好地处理单行。我遇到的问题是:对于带有换行符的长文本形成不良的正则表达式可能会导致意外结果,例如连接重置。我无法访问服务器端日志来进行故障排除。我该如何克服这个问题?
这只是我目前拥有的一个例子:我在下面搜索的{column}和{section}标签可以包含任意数量的属性,并包装任何文本。 {section}可能存在也可能不存在,可能是也可能不是{column}下的一行或多行,但必须将其包含在{column}中。 {column}本身可能存在也可能不存在,如果不存在,我不在乎,因为我稍后在脚本上插入了一些默认文本。我想获取内部部分内容并将其包装在html div标签中。我不记得我现在正在使用的确切模式,但它足够接近......
$pattern = "/\{column:id=summary([|]?([a-zA-Z0-9-_ ]+[:][a-zA-Z0-9-_ ]+[ ]?))\}(.*)({section([|]([a-zA-Z0-9-_ ]+[:][a-zA-Z0-9-_ ]+[ ]?))\}(.*)\{section\}(.*))?{column\}/s"; $replacement = "{html}<div id='summary'>$7</div>{html}"; $text = preg_replace($pattern, $replacement, $subject);
处理{column}和{section}属性并将有效的HTML参数传递给新的html div或它的子文本本身就是一个挑战,但我现在主要关注的是获得(。*)值{section}上面没有导致连接重置。有什么指针吗?
答案 0 :(得分:1)
这可能不是你想要的,但是:不要使用正则表达式!您正在尝试解析一些非常结构化,非常复杂的文本,为此,您应该使用解析器。我不知道什么是可用的PHP(你可以尽可能地使用谷歌,而且我无法做出任何特别的推荐)但我确信存在一些东西。
至于导致连接重置的原因,我唯一的猜测是,既然你提到了“长文本”的问题,你就会遇到内存分配问题。我不认为你的正则表达式会有意想不到的巨大性能,尽管它可能在非匹配的情况下。但是,如果可以的话,你最好的选择可能是废弃正则表达式技术并切换到真正的解析器。
答案 1 :(得分:1)
我发现了崩溃问题的可能来源:灾难性的回溯(http://www.regular-expressions.info/catastrophic.html)。因此,如果改进模式来处理它不起作用(如果有人有任何建议模式,请分享),切换到其他文本解析器解决方案将是最好的。
答案 2 :(得分:1)
我能看到的唯一真正的问题是所有(.*)
。在/s
模式下,每个(.*)
最初会覆盖整个页面,只需要大部分回溯。将它们全部更改为(.*?)
(即切换到不情愿的量词),它应该更快地运行。