正则表达式用于匹配 img 标记的开始和结束尖括号内的所有文本
Posted
技术标签:
【中文标题】正则表达式用于匹配 img 标记的开始和结束尖括号内的所有文本【英文标题】:Regex for matching all text inside opening and closing angle brackets of img tag 【发布时间】:2013-04-08 17:45:07 【问题描述】:我想创建正则表达式,以匹配开头内的文本及其匹配的 html img 标记与 php 的右尖括号。假设我在变量 $searchThis 中有 html 文本
$searchThis = "<html><div></div><img src='/relative/path/img1.png'/></div>
<img src='/relative/path/img2.png'/><div></div></div>
<img src='/relative/path/img3.png'/><ul><li></li></ul></html>";
我想匹配省略号替换的标签中的内容。结果必须是以下匹配项:
src='/relative/path/img1.png'
src='/relative/path/img2.png'
src='/relative/path/img3.png'
这就是我想象的模式应该是这样的,但实际上对我不起作用:
$pattern = "<img([^\/]+)\/>";
【问题讨论】:
您不应该尝试使用正则表达式解析 HTML。请改用 XPath 或一些类似的 XML 访问方法。看看this collection。 您只想通过正则表达式获取输出? simplehtmldom 呢? 好的,但是我不会使用 PHP 标准库中的任何东西。 【参考方案1】:试试:
preg_match_all("`<img (.*)/>`Uis", $searchThis, $results);
print_r($results);
打印$results
的结构将显示它的内容。
注意:如果您希望更准确,我建议您在搜索中包含src=
并一直到右引号,以便仅选择图像地址。然后您可以在之后添加缺少的文本 (src=
)。
这样,您仍然可以获得相对路径,即使您的图像标签看起来不像预期的那样(即标签中还有其他内容,例如alt="Smiley face" height="42" width="42"
)。
【讨论】:
我不知道。我总是使用字符 ` 来引用字符串模式,所以我可以添加 U、i、s 之类的东西来调整搜索选项。 任何非字母数字字符都可以用作正则表达式分隔符,尽管我必须承认我以前从未见过用于此目的的反引号。 我不记得第一次在哪里看到它。但是因为,我只使用这个字符。我看起来更清楚。也许我已经习惯了。 假设 HTML 是这样的:<html><img\nsrc='/relative/path/img1.png'/></html>
(<img
之后的新行)这个正则表达式还能工作吗?
不,因为我在<img
和(.*)
之间放置了一个空格。您可以删除空格,然后您将获得<img
和下一个(.*)
之间的所有内容。得到匹配后,还有一些工作要做:删除尾随空格(如果有的话)、换行符等。您需要更多关于我为什么放置U
、i
和s
的详细信息吗?以及为什么模式中有(.*)
?【参考方案2】:
永远不要尝试使用正则表达式解析 HTML。要解析 HTML,请使用 DOM Parser。考虑这样的代码:
$html = <<< EOF
<html><div></div><img src='/relative/path/img1.png'/></div>
<img src='/relative/path/img2.png'/><div></div></div>
<img src='/relative/path/img3.png'/><ul><li></li></ul></html>
EOF;
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query("//img");
for($i=0; $i < $nodelist->length; $i++)
$node = $nodelist->item($i);
$src = $node->attributes->getNamedItem('src')->nodeValue;
echo "src='$src'\n";
输出:
src='/relative/path/img1.png'
src='/relative/path/img2.png'
src='/relative/path/img3.png'
【讨论】:
谢谢!我不知道在标准 PHP 库中有一个 DOM Parser。我不经常使用 PHP,这不是我的强项。 @0xC0DEGURU:即使我没有为我的工作编写 PHP 代码。只有在回答有关 SO 的问题时,我才知道:P【参考方案3】:simplehtmldom 解析示例
<?php
include("simplehtmldom/simple_html_dom.php");
// Create DOM from URL or file
$html = str_get_html("<html><div></div><img src='/relative/path/img1.png'/></div>
<img src='/relative/path/img2.png'/><div></div></div>
<img src='/relative/path/img3.png'/><ul><li></li></ul></html>");
// Find all images
foreach($html->find('img') as $element)
echo $element->src . '<br>';
?>
【讨论】:
这似乎是最优雅的解决方案,但我只能使用标准库:) 谢谢以上是关于正则表达式用于匹配 img 标记的开始和结束尖括号内的所有文本的主要内容,如果未能解决你的问题,请参考以下文章