正则表达式用于匹配 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 是这样的:&lt;html&gt;&lt;img\nsrc='/relative/path/img1.png'/&gt;&lt;/html&gt;&lt;img 之后的新行)这个正则表达式还能工作吗? 不,因为我在&lt;img(.*) 之间放置了一个空格。您可以删除空格,然后您将获得&lt;img 和下一个(.*) 之间的所有内容。得到匹配后,还有一些工作要做:删除尾随空格(如果有的话)、换行符等。您需要更多关于我为什么放置Uis 的详细信息吗?以及为什么模式中有(.*)【参考方案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 标记的开始和结束尖括号内的所有文本的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配

Java中的正则表达式

学习笔记:正则表达式

正则表达式

匹配 XML 字符串的正则表达式在 C# 中具有开始和结束标记

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。