找到最后一次出现的“in”然后捕获之后的文本

时间:2011-01-31 10:22:27

标签: php regex preg-match

粗体文字是我试图捕捉“院子”。

这里有一艘船。 (在院子里
一艘船在这里。在院子里

我的正则表达式捕获“这里。(在院子里,它被第一个”in“抓住了,但我试图让它只能抓住”in“的最后一次出现。

我现在的正则表达式是

\s\(?in([^\)]+)\)?$

如果您知道解决方案,请解释正则表达式,我想了解它是如何工作的。

3 个答案:

答案 0 :(得分:3)

当您可以使用

时,不确定正则表达式的用途
$str = <<< TXT
One boat in here. (in the yard)
One boat in here. in the yard
TXT;

echo substr($str, strrpos($str, 'in') + 3); // 'the yard'

但这并不遵守单词边界。如果你需要单词边界,正则表达式确实是一个更好的选择(或使针“在”中)。有关正则表达式的体面教程,请参阅Perl's perlretut。大多数(如果不是全部)也适用于PHP。

答案 1 :(得分:3)

\s找一个空格
\(?零或一(即可选)左括号
in Literal i 后跟文字 n
[^\)]+捕获:一个或多个字符,其中任何一个都不是)(也许\(不确定此位))
\)?可选的右括号
$行尾

这显然与第一个字符串匹配,并且here. (in the yard被捕获。

修正:

.*\s\(?in([^\)]+)\)?$

.*导致正则表达式引擎首先找到字符串的结尾。然后它从那里回溯到中的最后一个

答案 2 :(得分:1)

正则表达式是

/.*(?<=\bin\b)(?P<founded>.*?)$/
  • \b是一个单词边界
  • (?<= ....)背后隐藏着。
  • $是字符串的结尾
  • .*贪婪
  • .*?是不合适的

所以完整的代码是

<?php
$str = "I am in the backyard";
preg_match('/.*(?<=\bin\b)(?P<founded>.*?)$/', $str, $matches);
var_dump($matches['founded']);

// returns string(13) " the backyard"

或者只是

$str = "I am in the light in the backyard";
$matches = preg_split('/\bin\b/', $str);
var_dump(end($matches));

// returns string(13) " the backyard"