使用preg_match_all从字符串中提取img src

时间:2013-03-10 16:11:46

标签: php regex html-parsing preg-match-all

我一直试图使用preg_match_all 30分钟,但看起来我做不到。

基本上我有$var,其中包含一串HTML代码。例如:

<br>iihfuhuf
<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"   
 src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg">
<img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>

我想在src值中获取包含img的{​​{1}}个标记的/temp/temp[a-z0-9]{13}\.jpeg属性值。

这是我到目前为止所做的:

src

5 个答案:

答案 0 :(得分:7)

<img[^>]*src="([^"]*/temp/temp[a-z0-9]{13}\.jpeg)"

<img[^>]*选择IMG标记

src="([^"]*)"获取src值并将其另存为匹配

/temp/temp[a-z0-9]{13}\.jpeg是src值的过滤器

对于快速RegEx测试,请使用一些在线工具,例如http://regexpal.com/

答案 1 :(得分:1)

您需要做的就是在正则表达式中添加另一个组。你有想要从大括号匹配中提取的所有内容:

preg_match_all('!(<img.*src="(.*/temp/temp[a-z0-9]{13}\.jpeg)"(.*alt=".*")?>)!', $content, $matches);

你可以看到工作here。您可以在$matches[2]中找到这些网址。

但只是因为说过:正则表达式不是从HTML中提取任何东西的合理方法。你最好使用DOMDocument,XPath或其他东西。

答案 2 :(得分:0)

试试这个:

preg_match_all('/src="([^"]+temp[a-z0-9]{13}\.jpeg)"/',$url,$matches);

var_dump($matches);

答案 3 :(得分:0)

<?php
$text = '<br>iihfuhuf<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"><img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>';
$pattern = '#src="([^"]+/temp/temp[a-z0-9]{13}\.jpeg)"#';
preg_match_all($pattern, $text, $out);
echo '<pre>';
print_r($out);
?>

Array
(
    [0] => Array
        (
            [0] => src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"
            [1] => src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"
        )

    [1] => Array
        (
            [0] => http://www.jlnv2.local/temp/temp513caca536fcd.jpeg
            [1] => http://www.jlnv2.local/temp/temp513caca73b8da.jpeg
        )

)

答案 4 :(得分:0)

以下是基于DOMDocument / DOMXPath的示例。这可以说是唯一正确的方法,因为除非你真的擅长正则表达式,否则很可能总是存在会破坏你逻辑的边缘情况。

$doc = new DOMDocument;
$xpath = new DOMXPath($doc);

$doc->loadHTML($content);

$candidates = $xpath->query("//img[contains(@src, '/temp/temp')]");

$result = array();
foreach ($candidates as $image) {
  $src = $image->getAttribute('src');
  if (preg_match('/temp[0-9a-z]{13}\.jpeg$/', $src, $matches)) {
    $result[] = $src;
  }
}

print_r($result);