PHP preg_match 从字符串末尾开始

PHP preg_match starting from end of string

我正在尝试捕获字符串模式,但从字符串的末尾开始。

如果我有这样的字符串:

"Hi, I saw you on tv yesterday. On Mon 4 P.M Alice wrote:"

捕获单词 "on" 和单词 "wrote:" 之间所有内容的常规 preg_match 将捕获 "on tv yesterday. On Mon 4 P.M Alice wrote:"。我要捕获"On Mon 4 P.M Alice wrote:"

我无法用 preg_match_all 解决它,因为它只会匹配第一个。

我的模式:

/(<div>|<br>|<br \/>|<br\/>)\s*on\s(.*)wrote:/i

我也尝试用 strrpos 解决它,但它不考虑空格。

谢谢, 马丁

您可以将此基于前瞻性的正则表达式用于 preg_match:

输入中的最后一个匹配项
/\bon\b(?:(?!\bon\b).)*?\bwrote\b/i

RegEx Demo

(?:(?!\bon\b).)*? 是基于负前瞻的正则表达式,当 on 没有出现在 onwrote 之间时,它们将匹配文本,因此 确保匹配输入中的最后一个匹配项

我认为最好的解决方案是使用我发现的这些不错的函数 here。我个人经常使用它,它从未让我失望。

<?php    
function strrevpos($instr, $needle)
    {
        $rev_pos = strpos (strrev($instr), strrev($needle));
        if ($rev_pos===false) return false;
        else return strlen($instr) - $rev_pos - strlen($needle);
    };
     function before ($this, $inthat)
        {
            return substr($inthat, 0, strpos($inthat, $this));
        };
     function between ($this, $that, $inthat)
        {
            return before ($that, after($this, $inthat));
        };
?>

然后您可以轻松地做到:

$string = 'Hi, I saw you on tv yesterday. On Mon 4 P.M Alice wrote:"';
$result = between ('On', 'wrote:', $string);
echo $result; //should echo "Mon 4 P.M Alice"