【问题标题】:How to match a part of an <iframe> tag?如何匹配 <iframe> 标签的一部分?
【发布时间】:2011-04-07 20:57:49
【问题描述】:

我正在尝试匹配此字符串的突出显示部分:

【问题讨论】:

    标签: php html regex match


    【解决方案1】:

    您应该为此使用 DOM 解析器。这是 DOMDocument 的示例:

    <?php
        $document = new DOMDocument();
        $document->loadHTML(file_get_contents('yourFileNameHere.html'));
        $lst = $document->getElementsByTagName('iframe');
    
        for ($i=0; $i<$lst->length; $i++) {
            $iframe= $lst->item($i);
            echo $iframe->attributes->getNamedItem('src')->value, '<br />';
        }
    ?>
    

    【讨论】:

    • 为什么使用 DOM 解析器比 preg_matching 出我想要的部分更好?只为这一切写一个似乎更简单?显然这出于某种原因更好,因为它已经得到了 5 个赞,呵呵...
    • @Nike 因为HTML is not regular。 HTML 可以被破坏,属性可以包含您希望在标签末尾找到的字符,标签可以嵌套......所有这些都使正则表达式成为解析 HTML 的坏工具。
    • @Nike 如果您只使用正则表达式,您可能会匹配评论中的&lt;iframe ... 标签,或者您的正则表达式可能无法处理可能出现在&lt;iframe 和@987654325 之间的某些字符@ 标记,或者您可能会在 src 属性的末尾弄错分隔符(属性可能不会被引用),如果您使用,您必须自己对 src 属性的内容进行 HTML 实体解码一个正则表达式,等等。当您在正则表达式中处理所有这些情况时,与仅使用 DOM 解析器相比,它会更长、更复杂并且更容易出错。
    • @Nick 看看这个例子:NotAPath"> regexp 如何有效地识别它不是 iframe ?
    【解决方案2】:
    <?php
    $html='<iframe maybe somethin gere src="http://some.random.url.com/" and blablabla';
    
    preg_match('|<iframe [^>]*(src="[^"]+")[^>]*|', $html, $matches);
    
    var_dump($matches);
    

    输出:

    array(2) {
      [0]=>
      string(75) "<iframe maybe somethin gere src="http://some.random.url.com/" and blablabla"
      [1]=>
      string(33) "src="http://some.random.url.com/""
    }
    

    但这是一种使用正则表达式的快速方法,它可能会破坏不干净的 html 或导致问题,请使用 dom 解析器以获得良好的证明解决方案。

    【讨论】:

      【解决方案3】:

      如果你的源是格式良好的 xml,你也可以使用 xpath 来查找字符串。

      <?php
        $file = simplexml_load_file("file.html");
        $result = $file->xpath("//iframe[@src]/@src");
      ?>
      

      【讨论】:

        【解决方案4】:

        正则表达式将是最简洁的方法:

        preg_match('<iframe.+?src="(.+?)".+?<\/iframe>', $iframe);
        
        print_r($iframe);
        
        array([0] => whole reg ex match, [1] => your src url);
        

        【讨论】:

        • 可能被否决了,因为不建议使用正则表达式解析 HTML。
        【解决方案5】:

        RegEx match open tags except XHTML self-contained tags

        也就是说,您的特定情况并没有真正解析......只是字符串匹配。 在我在这里回答之前已经列举了这些方法......

        【讨论】:

        • 每当我输入此类问题时,我都在等待失望,期待一个链接到该答案的帖子:)
        • 好吧,我们努力传播正则表达式 Dom 解析器及其消亡的故事:D
        【解决方案6】:

        您应该使用 DOM 解析器,但如果您有理由必须使用正则表达式,则此正则表达式会帮助您入门

        .*(?<iframeOpening><iframe)\s[^>]*(?<iframeSrc>src=['"][^>'"]+['"]?).*
        

        顺便说一下,它使用命名的捕获组,这是它们的工作原理

        preg_match('/.*(?<iframeOpening><iframe)\s[^>]*src=[\'"](?<iframeSrc>[^>\'"])+[\'"]?.*/', $searchText, $groups);
        print_r($groups['iframeSrc']);
        

        【讨论】:

        • 对不起,如果我不清楚。这匹配整个 iframe 元素,但我只想匹配 iframe 的 SRC。 :)
        • @Nike,您并不清楚,这与整个 iframe 元素不匹配,嗯,确实如此,但它包含命名组,因此您可以检索 src,请参阅我修改后的答案
        • 我们越来越近了,但这就是它现在返回的内容:src="existenz.se/amedia/?typ=youtube&url=http://www.youtube.com/…" marginheight="0"..... 但我只想返回实际值src 标签(不是 src="..")。
        • @Nike,现在试试,我稍微修改了一下
        • 现在出现错误:警告:preg_match() [function.preg-match]:编译失败:在偏移量 70 处没有可重复的内容......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        • 2022-12-22
        • 2022-01-04
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        相关资源
        最近更新 更多