我有以下问题:
我有一个这样的模式:
/(?<=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