php - PHP,正则表达式最后出现一个(或多个)字符串
问题描述
好的 - 这让我困惑了好几天。我尝试了带有负前瞻的正则表达式,但无济于事。
基本上,在 PHP 中,我需要解析会话线程并提取可以单独出现的 http 链接的最后一次出现,或者在 2 个或更多的连续组中出现。因此,在示例 1 中,它应该返回最后一个链接,但在示例 2 中,它应该返回最后 3 个链接。
我不需要用一个正则表达式来实现这一点,但我不确定还有什么其他方法可以尝试。任何帮助,将不胜感激!!
示例 1:
Lorem ipsum dolor sit amet, consectetur adipiscing elit。
在 pharetra elementum dui vel pretium。Quisque rutrum mauris vitae turpis hendrerit facilisis。Sed ultrices imperdiet ornare。
示例 2:
Lorem ipsum dolor sit amet, consectetur adipiscing elit。
在 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
解决方案
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
)
推荐阅读
- javascript - 快速获取请求不适用于查询字符串
- php - 将 PHP 项目部署到 Azure,而不将所有内容放在 Web 根目录中
- swift - Swift Combine - 不执行 Publishers.Zip 之后的内容
- python - 在 Ubuntu 上导入 pytube 时出现语法错误
- firebase - 我们可以在服务器端的 Spring Boot 中生成 fcm 令牌吗?
- reactjs - 使用数组作为反应钩子 useState
- r - r:在汇总条形图自定义函数中设置ylim
- python - 会员不和谐横幅
- javascript - ReactJs:将字符串转换为浮点数
- ios - 将项目数组分配给选定项目 - 核心数据中的多对多关系