我正在尝试使用正则表达式在我的博文中找到所有图片。如果代码是干净的,并且SRC标记紧跟在IMG标记之后,下面的代码将返回图像。但是,我还有其他属性的图像,如高度和宽度。我的正则表达式并没有选择那个...任何想法?
以下代码返回如下所示的图像:
<img src="blah_blah_blah.jpg">
但不是看起来像这样的图像:
<img width="290" height="290" src="blah_blah_blah.jpg">
这是我的代码
$pattern = '/<img\s+src="([^"]+)"[^>]+>/i';
preg_match($pattern, $data, $matches);
echo $matches[1];
答案 0 :(得分:4)
使用DOM
或其他解析器,不要尝试使用正则表达式解析HTML。
$html = <<<DATA
<img width="290" height="290" src="blah.jpg">
<img src="blah_blah_blah.jpg">
DATA;
$doc = new DOMDocument();
$doc->loadHTML($html); // load the html
$xpath = new DOMXPath($doc);
$imgs = $xpath->query('//img');
foreach ($imgs as $img) {
echo $img->getAttribute('src') . "\n";
}
输出
blah.jpg
blah_blah_blah.jpg
答案 1 :(得分:3)
有没有想过使用DOM对象而不是正则表达式?
$doc = new DOMDocument();
$doc->loadHTML('<img src="http://example.com/img/image.jpg" ... />');
$imageTags = $doc->getElementsByTagName('img');
foreach($imageTags as $tag) {
echo $tag->getAttribute('src');
}
答案 2 :(得分:1)
你最好使用解析器,但这是一种与regex有关的方法:
$pattern = '/<img\s.*?src="([^"]+)"/i';
答案 3 :(得分:1)
问题是您只能在\s+
之后接受<img
。试试这个:
$pattern = '/<img\s+[^>]*?src="([^"]+)"[^>]+>/i';
preg_match($pattern, $data, $matches);
echo $matches[1];
答案 4 :(得分:1)
试试这个:
$pattern = '/<img\s.*?src=["\']([^"\']+)["\']/i';
单引号或双引号以及动态src
attr位置。