【问题标题】:Matching SRC attribute of IMG tag using preg_match使用 preg_match 匹配 IMG 标签的 SRC 属性
【发布时间】:2011-01-11 22:08:28
【问题描述】:

我正在尝试运行 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

正则表达式应该是正确的,但我不知道为什么它似乎匹配边框属性而不是 src 属性。

或者,如果您有耐心读完这篇文章而没有直接跳到回复字段并输入“使用 HTML/XML 解析器”,那么可以推荐一个很好的教程,因为我找不到一个完全适用于 PHP 4。

PHP 4.4.7

【问题讨论】:

    标签: php regex parsing preg-match src


    【解决方案1】:

    你的表达不正确。试试:

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

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

    【讨论】:

    • 这成功了。不是实际解析 HTML 的“理想”解决方案,而是一种可行并提供必要结果的解决方案。谢谢!
    • 附带说明,$matches[0] 包含完整的 IMG 标签,$matches[1] 包含源 URI。
    【解决方案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...
    • 你试过include_once('htmlparser.inc');而不是include('htmlparser.inc');吗?
    【解决方案3】:

    这是一种使用内置函数 (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】:

      我使用的正则表达式要简单得多。我的代码假定传递给它的字符串只包含一个没有其他标记的 img 标签:

      $pattern = '/src="([^"]*)"/';
      

      在此处查看我的答案以获取更多信息:How to extract img src, title and alt from html using php?

      【讨论】:

      • "只有一个没有其他标记的 img 标签"?这是一个非常具体的案例,不是吗,对于几乎每个人来说可能有点太具体了:[
      【解决方案5】:

      如果你需要自己使用preg_match(),试试这个:

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

      【讨论】:

        【解决方案6】:

        这个任务应该由 dom 解析器执行,因为 regex 是 dom-ignorant。

        代码:(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
        

        这说:

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

        干净、适当、易于阅读和管理。

        【讨论】:

          猜你喜欢
          • 2021-04-05
          • 1970-01-01
          • 1970-01-01
          • 2017-10-14
          • 2011-09-20
          • 1970-01-01
          • 1970-01-01
          • 2017-05-21
          • 2021-07-27
          相关资源
          最近更新 更多