Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅当不在html属性中匹配时才提高正则表达式性能_Php_Html_Regex_Typo3 - Fatal编程技术网

Php 仅当不在html属性中匹配时才提高正则表达式性能

Php 仅当不在html属性中匹配时才提高正则表达式性能,php,html,regex,typo3,Php,Html,Regex,Typo3,使用打字脚本时,TYPO3会阻止呈现包含13个以上内容元素的页面: brandReplacing { stdWrap { replacement { 10 { search = ®(?=[<]*(?:<[^>]*>[^<]*)*$) replace = <sup>®</sup> useRegExp =

使用打字脚本时,TYPO3会阻止呈现包含13个以上内容元素的页面:

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>