我有包含所有html元素的字符串,我必须删除除图像之外的所有内容。
目前我正在使用此代码
$e->outertext = "<p class='images'>".str_replace(' ', ' ', str_replace('Â','',preg_replace('/#.*?(<img.+?>).*?#is', '',$e)))."</p>";
它服务于我的目的但执行速度很慢。任何其他方式做同样的事情都会很明显。
答案 0 :(得分:0)
您提供的代码似乎无法正常工作,甚至正则表达式也是错误的。您应该删除这样的初始斜杠/
:#.*?(<img.+?>).*?#is
。
您的心态是删除所有内容并仅留下图片标记,这不是一个好方法。更好的方法是考虑捕获所有图像标记,然后使用匹配来构造输出。首先让我们捕捉图像标签。这可以使用这个正则表达式完成:
/<img.*>/Ug
U
标志使正则表达式引擎变得懒惰而不是急切,因此它将匹配它找到的第一个>
的遭遇。
现在为了构造输出,我们使用方法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>";
改进该代码的另一种方法是使用函数式编程(例如array_reduce
)。但我会把它留作家庭作业。
注意:还有另一种方法可以解决html文档并使用XPath查找元素。查看this answer了解详情。