我正在尝试运行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" alt="Inside Otakuzoku's store" />
我得到了
0
正则表达式应该是正确的,但我不知道为什么它似乎匹配border属性而不是src属性。
或者,如果你有耐心阅读这篇文章而没有直接跳到回复字段并输入“使用HTML / XML解析器”,那么可以推荐一个很好的教程,因为我找不到一个完全适用于PHP 4。
PHP 4.4.7
答案 0 :(得分:33)
你的表情不正确。尝试:
preg_match('/< *img[^>]*src *= *["\']?([^"\']*)/i', $row->introtext, $matches);
请注意删除img和src周围的括号以及其他一些清理。
答案 1 :(得分:5)
这是一种使用内置函数(php&gt; = 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
答案 2 :(得分: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。
答案 3 :(得分:2)
如果您需要自己使用preg_match()
,请尝试以下操作:
preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches);
答案 4 :(得分:1)
我使用的正则表达式要简单得多。我的代码假定传递给它的字符串只包含一个没有其他标记的img标记:
$pattern = '/src="([^"]*)"/';
有关详情,请参阅我的回答:How to extract img src, title and alt from html using php?
答案 5 :(得分:1)
由于正则表达式不了解dom,因此应该由dom解析器执行此任务。
代码:(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
这说:
干净,适当,易于阅读和管理。