首页 > 解决方案 > 正则表达式不能限制搜索范围

问题描述

我有以下问题:

我有这样的模式:

/(?<=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

标签: phpregex

解决方案


您可以使用以下模式:

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

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

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

细节

  • template="- 文字文本
  • \K- 匹配重置运算符
  • [^"\/]*- 0 个或多个字符,而不是/and"
  • \/- 一个/字符
  • [^"\/]*- 0 个或多个字符,而不是/and"
  • \/- 一个/字符

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


推荐阅读