PHP,正则表达式最后出现一个(或多个)字符串

时间:2018-09-09 18:05:33

标签: php regex regex-lookarounds

好的-这让我感到困扰了好几天。我曾尝试使用正则表达式进行负前瞻,但无济于事。

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

我不需要使用单个正则表达式来实现这一目标,但是我不确定可以尝试其他哪种方法。任何帮助,将不胜感激!

示例1:

  

Lorem ipsum dolor坐着,安全奉献精英。

     

http://sample.com/12345.png

     

在pharetra elementum dui vel pretium中。 Quisque rutrum mauris vitae   turpis hendrerit facilisis。 Sed溃疡不正当。

     

http://sample.com/13578.png


示例2:

  

Lorem ipsum dolor坐着,安全奉献精英。

     

http://sample.com/12345.png

     

在pharetra elementum dui vel pretium中。 Quisque rutrum mauris vitae   turpis hendrerit facilisis。 Sed溃疡不正当。

     

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


1 个答案:

答案 0 :(得分:0)

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
)