PHP preg_match从字符串结尾开始

时间:2015-03-19 14:09:05

标签: php regex preg-match

我试图捕捉字符串模式,但是从字符串的结尾开始。

如果我有一个字符串:

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

捕获preg_match字和"on"字之间所有内容的常规"wrote:"将捕获"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来解决它,但它并不尊重空格。

谢谢,        马丁

2 个答案:

答案 0 :(得分:1)

您可以在preg_match的输入中使用此基于前瞻性的正则表达式进行最后一次匹配:

/\bon\b(?:(?!\bon\b).)*?\bwrote\b/i

RegEx Demo

(?:(?!\bon\b).)*?是基于正面的否定正则表达式,当onwrote之间没有出现时,会匹配on和{{1}}之间的文字,因此确保在输入中匹配最后一场比赛

答案 1 :(得分:1)

我认为最好的解决方案是使用我发现的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"