Php 仅当不在html属性中匹配时才提高正则表达式性能
使用打字脚本时,TYPO3会阻止呈现包含13个以上内容元素的页面:Php 仅当不在html属性中匹配时才提高正则表达式性能,php,html,regex,typo3,Php,Html,Regex,Typo3,使用打字脚本时,TYPO3会阻止呈现包含13个以上内容元素的页面: brandReplacing { stdWrap { replacement { 10 { search = ®(?=[<]*(?:<[^>]*>[^<]*)*$) replace = <sup>®</sup> useRegExp =
brandReplacing {
stdWrap {
replacement {
10 {
search = ®(?=[<]*(?:<[^>]*>[^<]*)*$)
replace = <sup>®</sup>
useRegExp = 1
}
}
}
}
html代码:
<img title="Copyright replacement incorrect ®" src="/fileadmin/filexyz.png">
<h1>Copyright replacement correct: ®</h1>
Also correct replacement here: ®
Maybe NOT here: <sup>®</sup>
版权替换正确:®
这里也有正确的替换:®
也许不在这里:®
我并没有分析你的正则表达式来找出到底发生了什么,但很明显,回溯正在消耗资源。还有其他方法可以终止模式以阻止其进一步发展:遵循规则。
应该有一些规则来定义属性及其占位符。我附带了两条规则,您可以稍后添加到其中(请参见like when®位于属性值内):
attr=“value”
由目前的一个。匹配将继续,直到引擎看到一个不带
跳过任何
:[^”]*“(\s\s*[\w-]+=”[^]*>
:\/?>
(®)(?!([^"<>]*"(\s\s*[\w-]+="[^<>]*>|\s*\/?>)))
- 如果在文本中紧接着一个
或“/>
,例如:”>
®”/>
我认为这种情况很少发生。我没有分析你的正则表达式来找出到底发生了什么,但很明显,回溯正在消耗资源。有其他方法可以结束一种模式,防止它进一步发展:遵循规则。 应该有一些定义属性及其占位符的规则。我提供了两个规则,您可以在以后添加到它们中(如当®位于属性值内时所示):
attr=“value”
通过当前一个。匹配将继续,直到引擎看到一个不带
跳过任何
:[^”]*“(\s\s*[\w-]+=”[^]*>
:\/?>
(®)(?!([^"<>]*"(\s\s*[\w-]+="[^<>]*>|\s*\/?>)))
- 如果在文本中紧接着一个
或“/>
,例如:”>
®”/>
我认为这种情况很少发生。尝试使用所有格量词:
®(?=[^]*+(?:]*>[^哇!太棒了,性能提高了75%。你是否也知道如何排除已包装的®
-符号?否则我会接受这个答案;)不要用regex101的步数来衡量性能。真正的性能只能在目标环境中测试。请尝试PCRE(?:®|]*>)(*SKIP)(*F)| |
在TYPO3中的regex。@Y.Hermes:您正在尝试用regex解析HTML:您的任务是查找(R)在文本节点中,但仅当它不是
-标记的唯一内容时。这显然超出了正则表达式和问题来源的范围。正确的方法是通过PHP脚本过滤HTML,该脚本使用和相关功能解析HTML,遍历所有文本节点(属于sup
节点的子节点除外),并替换这些文本节点中的(R)。然后将结果序列化为HTML并返回/打印。尝试使用所有格量词:?=[^]*+(?:]*>[^Wow!太棒了,性能提高了75%。你也知道如何排除已经包装好的
-符号吗?否则我会接受这个答案;)不要用regex101的步数来衡量性能。真正的性能只能在目标环境中测试。试试PCRE(?:®|]*>)(*跳过)(*F)®
TYPO3中的正则表达式。@Y.Hermes:您正试图用正则表达式解析HTML:您的任务是查找(R)在文本节点中,但仅当它不是
-标记的唯一内容时。这显然超出了正则表达式和问题来源的范围。正确的方法是通过PHP脚本过滤HTML,该脚本使用和相关功能解析HTML,遍历所有文本节点(属于sup
节点的子节点除外),并替换这些文本节点中的(R)。然后将结果序列化为HTML并返回/打印。
<div>® character" some-chars-here="...." /></div>
<div>® " /></div>