好的-这让我感到困扰了好几天。我曾尝试使用正则表达式进行负前瞻,但无济于事。
基本上,在PHP中,我需要解析会话线程并提取最后一次出现的http链接,这些链接可以单独出现,也可以是连续的2个或更多组出现。因此,在示例1中,它应该返回最后一个链接,但是在示例2中,它应该返回最后3个链接。
我不需要使用单个正则表达式来实现这一目标,但是我不确定可以尝试其他哪种方法。任何帮助,将不胜感激!
Lorem ipsum dolor坐着,安全奉献精英。
在pharetra elementum dui vel pretium中。 Quisque rutrum mauris vitae turpis hendrerit facilisis。 Sed溃疡不正当。
Lorem ipsum dolor坐着,安全奉献精英。
在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
答案 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
)