首页 > 解决方案 > PHP,正则表达式最后出现一个(或多个)字符串

问题描述

好的 - 这让我困惑了好几天。我尝试了带有负前瞻的正则表达式,但无济于事。

基本上,在 PHP 中,我需要解析会话线程并提取可以单独出现的 http 链接的最后一次出现,或者在 2 个或更多的连续组中出现。因此,在示例 1 中,它应该返回最后一个链接,但在示例 2 中,它应该返回最后 3 个链接。

我不需要用一个正则表达式来实现这一点,但我不确定还有什么其他方法可以尝试。任何帮助,将不胜感激!!

示例 1:

Lorem ipsum dolor sit amet, consectetur adipiscing elit。

http://sample.com/12345.png

在 pharetra elementum dui vel pretium。Quisque rutrum mauris vitae turpis hendrerit facilisis。Sed ultrices imperdiet ornare。

http://sample.com/13578.png


示例 2:

Lorem ipsum dolor sit amet, consectetur adipiscing elit。

http://sample.com/12345.png

在 pharetra elementum dui vel pretium。Quisque rutrum mauris vitae turpis hendrerit facilisis。Sed ultrices imperdiet ornare。

http://sample.com/24689.png
http://sample.com/13578.png
http://sample.com/98761.png


标签: phpregexregex-lookarounds

解决方案


1)在分隔符上拆分您的文本\s

$resultArray = preg_split("@\s@", $conversation)

例如:

$conversation = "Hallo, http://1.de text http://2.de\r\nhttp://3.de Hello";

(这将产生类似这样的中间结果:)

Array
(
    [0] => Hallo,
    [1] => http://1.de
    [2] => text
    [3] => http://2.de
    [4] => 
    [5] => http://3.de
    [6] => Hello
)

2.) 最后,反向迭代结果数组。开始“匹配”,如果结果以“http://”开头 - 如果遇到其他任何内容,则停止匹配,忽略空行以及仅包含空格的行。:

$conversation = "Hallo, http://1.de text http://2.de\r\nhttp://3.de Hello";
$resultArray = preg_split("@\s@", $conversation);
$result = array();

$matching = false;
for ($i = count($resultArray)-1; $i >= 0; $i--){
    if (preg_match("@http:\/\/@", $resultArray[$i])){
      $matching=true;
      $result[] = $resultArray[$i];  
    } else if (preg_match("@^\s*$@", $resultArray[$i])){
       //ignore this bad boy
    }else{
        if ($matching){
            break;
        }
    }
}

echo "<pre>";
print_r(array_reverse($result));
echo "</pre>";

产量:

Array
(
    [0] => http://2.de
    [1] => http://3.de
)

推荐阅读