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

16

我试图使用preg_match从文章中的第一个IMG标签(在这种情况下存储在$row->introtext中)中提取SRC属性。

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

不要获取像这样的内容

images/stories/otakuzoku1.jpg

来自

<img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku's store" />

我只能获得

0
正则表达式可能没问题,但我不知道为什么它似乎匹配了边框属性而非src属性。
或者,如果您已经有耐心读到这里,而没有直接跳到回复栏并键入"use a HTML/XML parser",那么是否可以推荐一个好的教程,因为我很难找到一个适用于PHP 4的教程。
PHP 4.4.7
6个回答

46

您的表达不正确。请尝试:

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

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

1
这解决了问题。虽然不是“理想”的解决方案,因为实际上没有解析HTML,但它是一个可行的方案,能够得到必要的结果。谢谢! - KyokoHunter
2
作为附注,$matches [0] 包含完整的 IMG 标签,$matches [1] 包含源 URI。 - Talvi Watia

5

以下是使用内置函数实现的方法(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

如果您需要使用 preg_match()本身,请尝试以下方法:

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

2

尝试:

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

$html = 'bla <img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku\'s store" /> 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... - KyokoHunter
你尝试过使用include_once('htmlparser.inc');而不是include('htmlparser.inc');吗? - Bart Kiers

1

“只有一个img标签,没有其他标记”?这是一个非常特定的情况,对于几乎所有人来说可能有点太具体了 :[ - Andrew

1
这项任务应该由DOM解析器执行,因为正则表达式无法识别DOM。
代码:(演示)
$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

这段话的意思是:

这句话的意思是:

  1. 解析整个html字符串
  2. 分离出所有的img标签
  3. 分离出第一个img标签
  4. 分离出它的src属性值

干净、适当、易读易管理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接