使用正则表达式从字符串中删除除image参数之外的所

时间:2015-09-09 11:48:08

标签: php regex

我有包含所有html元素的字符串,我必须删除除图像之外的所有内容。

目前我正在使用此代码

$e->outertext = "<p class='images'>".str_replace(' ', ' ', str_replace('Â','',preg_replace('/#.*?(<img.+?>).*?#is', '',$e)))."</p>";

它服务于我的目的但执行速度很慢。任何其他方式做同样的事情都会很明显。

1 个答案:

答案 0 :(得分:0)

您提供的代码似乎无法正常工作,甚至正则表达式也是错误的。您应该删除这样的初始斜杠/#.*?(<img.+?>).*?#is

您的心态是删除所有内容并仅留下图片标记,这不是一个好方法。更好的方法是考虑捕获所有图像标记,然后使用匹配来构造输出。首先让我们捕捉图像标签。这可以使用这个正则表达式完成:

/<img.*>/Ug

U标志使正则表达式引擎变得懒惰而不是急切,因此它将匹配它找到的第一个>的遭遇。

DEMO1

现在为了构造输出,我们使用方法preg_match_all并将结果放在一个字符串中。这可以使用以下代码完成:

<?php
// defining the input
$e = 
'<div class="topbar-links"><div class="gravatar-wrapper-24">
<img src="https://www.gravatar.com/avatar" alt="" width="24" height="24"     class="avatar-me js-avatar-me">
</div>
</div> <img test2> <img test3> <img test4>';
// defining the regex
$re = "/<img.*>/U";
// put all matches into $matches
preg_match_all($re, $e, $matches);
// start creating the result
$result = "<p class='images'>";
// loop to get all the images
for($i=0; $i<count($matches[0]); $i++) {
    $result .= $matches[0][$i];
}
// print the final result
echo $result."</p>";

DEMO2

改进该代码的另一种方法是使用函数式编程(例如array_reduce)。但我会把它留作家庭作业。

注意:还有另一种方法可以解决html文档并使用XPath查找元素。查看this answer了解详情。