粗体文字是我试图捕捉“院子”。
这里有一艘船。 (在院子里)
一艘船在这里。在院子里
我的正则表达式捕获“这里。(在院子里,它被第一个”in“抓住了,但我试图让它只能抓住”in“的最后一次出现。
我现在的正则表达式是
\s\(?in([^\)]+)\)?$
如果您知道解决方案,请解释正则表达式,我想了解它是如何工作的。
答案 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'
见
strrpos
— Find the position of the last occurrence of a substring in a string substr
— Return part of a string 但这并不遵守单词边界。如果你需要单词边界,正则表达式确实是一个更好的选择(或使针“在”中)。有关正则表达式的体面教程,请参阅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"