使用 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标签