使用 preg_match 匹配 IMG 标签的 SRC 属性

Posted

技术标签:

【中文标题】使用 preg_match 匹配 IMG 标签的 SRC 属性【英文标题】:Matching SRC attribute of IMG tag using preg_match 【发布时间】:2011-01-11 22:08:28 【问题描述】:

我正在尝试运行 preg_match 以从文章中的第一个 IMG 标记中提取 SRC 属性(在本例中,存储在 $row->introtext 中)。

preg_match('/\< *[img][^\>]*[src] *= *[\"\']0,1([^\"\']*)/i', $row->introtext, $matches);

而不是得到类似的东西

images/stories/otakuzoku1.jpg

来自

<img src="images/stories/otakuzoku1.jpg" border="0"  />

我明白了

0

正则表达式应该是正确的,但我不知道为什么它似乎匹配边框属性而不是 src 属性。

或者,如果您有耐心读完这篇文章而没有直接跳到回复字段并输入“使用 html/XML 解析器”,那么可以推荐一个很好的教程,因为我找不到一个完全适用于 php 4。

PHP 4.4.7

【问题讨论】:

【参考方案1】:

你的表达不正确。试试:

preg_match('/< *img[^>]*src *= *["\']?([^"\']*)/i', $row->introtext, $matches);

请注意移除了 img 和 src 周围的括号以及其他一些清理操作。

【讨论】:

这成功了。不是实际解析 HTML 的“理想”解决方案,而是一种可行并提供必要结果的解决方案。谢谢! 附带说明,$matches[0] 包含完整的 IMG 标签,$matches[1] 包含源 URI。【参考方案2】:

试试:

include ("htmlparser.inc"); // from: http://php-html.sourceforge.net/

$html = 'bla <img src="images/stories/otakuzoku1.jpg" border="0"  /> noise <img src="das" /> foo';

$parser = new HtmlParser($html);

while($parser->parse()) 
    if($parser->iNodeName == 'img') 
        echo $parser->iNodeAttributes['src'];
        break;
    

这将产生:

images/stories/otakuzoku1.jpg

它应该适用于 PHP 4.x。

【讨论】:

一些问题让 htmlparser.inc 工作。错误消息说该类已经启动,但它不是。我会坚持将提供商升级到 PHP 5... 你试过include_once('htmlparser.inc');而不是include('htmlparser.inc');吗?【参考方案3】:

这是一种使用内置函数 (php >= 4) 的方法:

$parser = xml_parser_create();
xml_parse_into_struct($parser, $html, $values);
foreach ($values as $key => $val) 
    if ($val['tag'] == 'IMG') 
        $first_src = $val['attributes']['SRC'];
        break;
    


echo $first_src;  // images/stories/otakuzoku1.jpg

【讨论】:

【参考方案4】:

我使用的正则表达式要简单得多。我的代码假定传递给它的字符串只包含一个没有其他标记的 img 标签:

$pattern = '/src="([^"]*)"/';

在此处查看我的答案以获取更多信息:How to extract img src, title and alt from html using php?

【讨论】:

"只有一个没有其他标记的 img 标签"?这是一个非常具体的案例,不是吗,对于几乎每个人来说可能有点太具体了:[【参考方案5】:

如果你需要自己使用preg_match(),试试这个:

 preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches);

【讨论】:

【参考方案6】:

这个任务应该由 dom 解析器执行,因为 regex 是 dom-ignorant。

代码:(Demo)

$row = (object)['introtext' => '<div>test</div><img src="source1"><p>text</p><img src="source2"><br>'];

$dom = new DOMDocument();
$dom->loadHTML($row->introtext);
echo $dom->getElementsByTagName('img')->item(0)->getAttribute('src');

输出:

source1

这说:

    解析整个 html 字符串 隔离所有img标签 隔离第一个img标签 隔离其src属性值

干净、适当、易于阅读和管理。

【讨论】:

以上是关于使用 preg_match 匹配 IMG 标签的 SRC 属性的主要内容,如果未能解决你的问题,请参考以下文章

preg_match_all() php正则匹配图片路径,怎么取完整的图片链接。带http开头,求解决

如何用正则表达式匹配除了img标签的所有其他标签 匹配所有html标签我知道: /<[^>]+>/g 关键排除img标签

PHP正则匹配img标签的正则 并获得alt属性的值

php简单正则匹配Img标签src内容采集?

java正则表达式匹配img标签并替换

匹配img标签 js正则表达式