【问题标题】:how to match specific text link with php regex如何将特定文本链接与 php 正则表达式匹配
【发布时间】:2014-02-09 06:37:16
【问题描述】:

在这里,我正在寻找一个 PHP 中的正则表达式,它将锚点与特定的“target="_parent" 匹配。我想获得带有如下文本的锚点:

preg_match_all('<a href="http://" target="_parent">Text here</a>', subject, matches, PREG_SET_ORDER);

HTML:

<a href="http://" target="_parent">

    <FONT style="font-size:10pt" color=#000000 face="Tahoma">
        <DIV><B>Text</B> - Text </DIV>
    </FONT>

</a>

</DIV>

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    说实话,最好的方法是根本不使用正则表达式。否则,您将错过各种不同的链接,尤其是如果您不知道这些链接总是具有相同的生成方式。

    最好的方法是使用 XML 解析器。

    <?php
    
    $html = '<a href="http://" target="_parent">Text here</a>';
    function extractTags($html) {
        $dom = new DOMDocument;
        libxml_use_internal_errors(true);
        $dom->loadHTML($html); // because dom will complain about badly formatted html
        $sxe = simplexml_import_dom($dom);
        $nodes = $sxe->xpath("//a[@target='_parent']");
    
        $anchors = array();
        foreach($nodes as $node) {
            $anchor = trim((string)dom_import_simplexml($node)->textContent);
            $attribs = $node->attributes();
            $anchors[$anchor] = (string)$attribs->href;
        }
    
        return $anchors;
    }
    
    print_r(extractTags($html))
    

    这将输出:

    Array (
        [Text here] => http://
    )
    

    即使在您的示例中使用它:

    $html = '<a href="http://" target="_parent">
    
    <FONT style="font-size:10pt" color=#000000 face="Tahoma">
            <DIV><B>Text</B> - Text </DIV>
                </FONT>
    
                </a>
    
                </DIV>
                ';
                print_r(extractTags($html));
    

    将输出:

    Array (
        [Text - Text] => http://
    )
    

    如果您觉得 HTML 仍然不够干净,无法与 DOMDocument 一起使用,那么我建议您使用 HTMLPurifier 之类的项目(请参阅http://htmlpurifier.org/)首先完全清理 HTML(并删除不需要的 HTML)并使用它的输出加载到 DOMDocument 中。

    【讨论】:

    • 我已经对 DOM 有所了解,但我需要正则表达式来处理这些匹配,DOM 无法处理 html 标记。
    • @user1218948 即使使用您的示例,此代码仍然有效。在正则表达式甚至考虑成为可接受的解决方案之前,您将需要提供一个更大的失败示例:P
    • 不仅,target='_parent' 它的抓取 target='_blank' 也是如此
    • @user1218948 然后将 xpath 查询更改为:$nodes = $sxe-&gt;xpath("//a[@target='_blank' or @target='_parent']");
    • $nodes = $sxe->xpath('//a[@target="_parent"]');我使用了双引号,它已修复,所以我们不再有任何格式错误的 html 解析问题?
    【解决方案2】:

    您应该使用DOMDocument 类而不是正则表达式。如果您使用正则表达式处理 HTML,您会得到很多误报结果。

    <?php
    
    $html='<a href="http://" target="_parent">Text here</a>';
    $dom = new DOMDocument;
    $dom->loadHTML($html);
    foreach ($dom->getElementsByTagName('a') as $tag) {
        if ($tag->getAttribute('target') === '_parent') {
           echo $tag->nodeValue;
        }
    }
    

    OUTPUT :

    Text here
    

    【讨论】:

    • html 标记太丑陋,DOM 无法处理误导性标签。
    • 你需要把你的 HTML 源代码放上来让大家看看。如果你认为 DOM 在这种情况下更糟糕,Regex 会更糟糕!
    • @user1218948,您的预期输出是什么?
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多