【问题标题】:Extract img src from string with preg_match_all使用 preg_match_all 从字符串中提取 img src
【发布时间】:2013-02-25 19:00:33
【问题描述】:

我已经尝试使用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>

我想获取img 标记的src 属性值,这些标记的src 值中包含/temp/temp[a-z0-9]{13}\.jpeg

这是我目前所拥有的:

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

【问题讨论】:

  • 你尝试了 30 分钟......你想出了什么,什么没用?
  • preg_match_all('!!', $content, $matches);我只是不太明白 preg_match_all 是如何工作的。我可以制作模式,但不能让 preg_match_all 像我期望的那样工作。
  • @MarcDupuis 您应该为此使用 DOM 和 XPath,而不是(仅)正则表达式。将 HTML 加载到 &lt;img&gt; 标记的 &lt;img&gt; 和 XPath 中,其中 src 包含 /temp/temp,您可以轻松地迭代匹配的节点并使用正则表达式来提取您需要的数据。您甚至可以使用 XPath 注册 PHP 函数,以便直接在 XPath 查询中使用您的正则表达式。
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php.html
  • 感谢您的建议,但代码是从所见即所得编辑器生成的,我只需要在将图像保存到数据库之前替换图像的 src。所以代码将永远是我所期望的。不过,感谢您让我了解 DOMDocument。

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


【解决方案1】:
<img[^>]*src="([^"]*/temp/temp[a-z0-9]{13}\.jpeg)"

&lt;img[^&gt;]*选择IMG标签

src="([^"]*)" 获取 src 值并保存为匹配项

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

为了快速进行 RegEx 测试,请使用一些在线工具,例如 http://regexpal.com/

【讨论】:

  • 你应该转义点\.
  • 你也应该转义 src="([^"]*)" 中的第二个 "
【解决方案2】:

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

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

您可以看到 here 正在工作。您可以在$matches[2] 中找到这些 URL。

但我已经说过了:正则表达式不是从 HTML 中提取任何内容的合理方法。您最好使用 DOMDocument、XPath 或类似的东西。

【讨论】:

    【解决方案3】:

    这是一个基于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);
    

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

        【解决方案5】:
        <?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
                )
        
        )
        

        【讨论】:

          【解决方案6】:
          $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( '@src="([^"]+)"@' , $text, $match );
          $src = array_pop($match);
          
          echo $src;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多