每个文章可匹配的结果都不一样的情况下,preg_match_all 如何返回最后一个匹配结果,或者有没有办法从最后开始匹配?

2015-05-03 00:31:52 +08:00
 ab
比如要正则处理每个文章,使其返回最后一个img标签. 但是每个文章的img标签数量又都不一致
2597 次点击
所在节点    PHP
6 条回复
Septembers
2015-05-03 00:37:13 +08:00
shiny
2015-05-03 00:48:29 +08:00
这个不应该用 DOM 处理嘛
Septembers
2015-05-03 01:25:12 +08:00
@shiny 注意题者的环境是PHP解析DOM再操作的代价。。。。。。。。。。。。
feiyuanqiu
2015-05-03 05:26:56 +08:00
你看一下 preg_match_all 的文档,它会返回匹配的次数,你直接用这个次数就可以获取到最后一个匹配:

<?php
$article = <<<EOT
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<img src="//cdn.v2ex.co/avatar/2cd8/7697/76017_large.png?m=1412760421" class="avatar" border="0" align="default">
<img src="//cdn.v2ex.co/avatar/2cd8/7697/76017_large.png?m=1412760422" class="avatar" border="0" align="default">
<img src="//cdn.v2ex.co/avatar/2cd8/7697/76017_large.png?m=1412760423" class="avatar" border="0" align="default">
<img src="//cdn.v2ex.co/avatar/2cd8/7697/76017_large.png?m=1412760424" class="avatar" border="0" align="default">
</div>
</body>
</html>
EOT;

$pattern = '/<img[^>]+src\\s*=\\s*[\'\"]([^\'\"]+)[\'\"][^>]*>/im';

// 设置 flag 为 PREG_SET_ORDER
if ($match = preg_match_all($pattern, $article, $matches, PREG_SET_ORDER)) {
var_dump($matches[--$match]);
}

// 不设置 PREG_SET_ORDER
if ($match = preg_match_all($pattern, $article, $matches)) {
var_dump($matches[0][--$match]);
}
feiyuanqiu
2015-05-03 05:29:37 +08:00
或者不需要 preg_match_all 的返回值:

if (preg_match_all($pattern, $article, $matches, PREG_SET_ORDER)) {
$last = array_pop($matches);
var_dump($last);
}
ab
2015-05-03 15:46:10 +08:00
@feiyuanqiu 非常感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX