【问题标题】:Extracting specific text from HTML texts从 HTML 文本中提取特定文本
【发布时间】:2015-07-06 09:26:03
【问题描述】:

我对正则表达式不太熟悉。我正在尝试获得底部描述的结果。这是我到目前为止所做的(注意$page 包含制表符):

$page = "<div class=\"title-container\">
                            <h1>Text here<span> /Sub-text/</span> </h1>
                                                     </div>";
// TITLE
preg_match_all ('/<h1>(.*)<\/h1>/U', $page, $out);
$hutitle = preg_replace("#<span>(.*)<\/span>\s#", "", $out[1][0]);

$entitle = preg_replace("'(.*)<span> /'", "", $out[1][0]);

我想得到这个:

$hutitle = "Text here"; 
$entitle = "Sub-text"; (Without html and "/")

【问题讨论】:

    标签: php regex string preg-match-all


    【解决方案1】:

    我建议将 DOM 与 trim 一起使用,不需要正则表达式,这是针对您的具体案例的工作代码:

    $page = "<div class=\"title-container\">\n                            <h1>Text here<span> /Sub-text/</span> </h1>\n                                                     </div>";
    
    $dom = new DOMDocument;
    $dom->loadHTML($page);
    $hs = $dom->getElementsByTagName('h1');
    foreach ($hs as $h) {
        $enttitlenodes = $h->getElementsByTagName('span');
        if ($enttitlenodes->length > 0 && $enttitlenodes->item(0)->tagName == 'span')
        {
            $entitle = trim($enttitlenodes->item(0)->nodeValue, " /");
            echo $entitle . "\n";
            $h->removeChild($enttitlenodes->item(0)); 
        }
        $hutitle = $h->nodeValue;
        echo $hutitle;
    }
    

    IDEONE demo

    【讨论】:

    • DOMDocument::getElementsByTagName 返回一个DOMNodeList 不是一个数组,所以你不能在php 5.6.3 之前写$h-&gt;getElementsByTagName('span')[0]$h-&gt;getElementsByTagName('span')-&gt;item(0)。这并不意味着它从 php 5.6.3 开始返回一个数组,而只是你可以通过数组表示法访问项目。
    • @CasimiretHippolyte:我明白了,我更新了代码,它现在甚至可以检查&lt;span&gt; 标签的存在。
    • 在这种情况下,不要使用 count(旨在计算数组项),而是使用属性 DOMNodeList::length
    • 你能用非面向对象的方法写这个吗?什么是最低 php 版本 5.?
    • @Gable:你的意思是你仍然坚持使用正则表达式解决方案?
    【解决方案2】:

    试试这个

    <h1>(.*?)<span> /(.*?)/</span>
    

    $1 和 $2 是您预期的结果。

    【讨论】:

    • /&lt;h1&gt;(.*)&lt;span&gt;(.*?)&lt;\/span&gt;(.*)&lt;\/h1&gt;/ 这对我有用
    • 是的,两者依次相同。安全的方式使用它
    • 很高兴为您提供帮助。 :)
    • 在记事本++中试试这个

      (.*?) /(.*?)/

    • 我认为不需要\/
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2011-06-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多