Regex无法限制搜索范围



我有以下问题:

我有一个这样的模式:

/(?<=template=")(.*?)(.*/)/gm 

还有这样一段文字:

template="test/widgets/glasgow.phtml"}}

我的正则表达式应该在我的文件前面搜索路径,我需要把它剪下来,这样它的结尾会是这样的:

template="glasgow.phtml"}}

这很好,但问题是我有时有一个文本看起来像这样:

block="core/template" template="test/widgets/getcallus.phtml"}}</p>

它把所有东西都删掉,直到</

这是削减:

test/widgets/getcallus.phtml"}}</

代替:

test/widgets/

我试着用$来限制结尾,但它无济于事。

我正在regexr.com 上测试它

https://regexr.com/50hi2

您可以使用以下模式:

template="K[^"/]*/[^"/]*/

请参阅regex演示。在PHP中,如果指定另一个正则表达式分隔符:,则可以去掉反斜杠

$regex = '~template="K[^"/]*/[^"/]*/~';

详细信息

  • template="-文本
  • K-匹配重置运算符
  • [^"/]*-除/"之外的0个或更多个字符
  • /-一个/字符
  • [^"/]*-除/"之外的0个或更多个字符
  • /-一个/字符

它等于template="K(?:[^"/]*/){2},其中(?:...){2}重复两次模式的非捕获组序列。

小心(.*?)(.*/)

此模式对应于REDOS漏洞。(有2^n种方法可以读取最后一个/之前的n个字符…

要使正则表达式对您的正则表达式关闭,您可以使用/(?<=template=")([^"]*?/)*([^"]*)"/

([^"]*?/)*读取尽可能多的块"既不是/也不是",后面跟着/"。

https://regex101.com/r/SMSv5R/2

最新更新