灾难性的回溯

时间:2016-10-03 12:30:22

标签: php regex

我的正则表达式存在一些问题:

if (preg_match_all('/{[a-z]+:ce_img:(single|pair)(\s.*)*}/', $files, $matches))
{
   echo "ok";
}

出于某种原因,它会导致我的网站崩溃。当然,我已经尝试谷歌并发现了一些关于“灾难性回溯”的事情,虽然我不确定这是否是我的问题。

正则表达式应该给我{eggs:ce_img:single(或pair)到结尾}之间的所有内容

当我尝试更改或删除(单个|对)时,它只是正常运行。那应该是关于那个权利的事情吗?

我很确定$文件不是问题。

有人知道如何解决这个问题吗?

问候,Olcan

编辑: 这里有一个关于这个正则表达式应该如何工作的例子: image

2 个答案:

答案 0 :(得分:1)

这应该有效:

{[a-z]+:ce_img:(?:single|pair)?([\w\W\s]+)*}

对于图片中显示的文字:

{eggs:ce_img:single 
   src="{src}"
   fallback_src="/assets/a-b-c.jpg"
   width="250"
   height="250"
   add_dims="no"
   crop="yes"
   title="{title}"
   alt="{title}"
   allow_scale_larger="yes"
}

你会得到:

Group 1     src="{src}"
            fallback_src="/assets/a-b-c.jpg"
            width="250"
            height="250"
            add_dims="no"
            crop="yes"
            title="{title}"
            alt="{title}"
            allow_scale_larger="yes"

在此处查看演示:https://regex101.com/r/uo9Kqi/1

答案 1 :(得分:1)

您的RegEx崩溃了您的网站(由于灾难性的回溯),因为您的输入文件至少包含其中一个:

  1. 目标阻止后的多个空格字符
  2. 在目标块之后具有空格的字符序列。与{[a-z]+:ce_img:(?:single|pair)(?:\s+[\w-]+="[^"]*")*\s*} 类似。
  3. 解决方案:

    (?:                    # Start of non-capturing group (a)
        \s+[\w-]+="[^"]*"  # Match similar following string `attr="value"`
    )*                     # Many or zero times - end of non-capturing block (a)
    \s*                    # Match all space characters if any, before closing brace `}`
    

    这与您的模式特别匹配。最后不同部分的解释:

    __super::OnChangeActiveTab(wp, lp);