【问题标题】:Get HTML comment from $p->nodeValue possible with DomXPath?使用 DomXPath 从 $p->nodeValue 获取 HTML 注释?
【发布时间】:2018-10-13 22:43:56
【问题描述】:

我有几个这样的 HTML 段落(总是相同的结构):

<p>
    <!-- Gl. 1-4 -->
    \( x(t) = x_0 · t^3 \)
    [!equanchor? &id=`555`!]
</p>

我正在通过以下方式成功提取555

$xpath = new DomXPath($dom);
$paragraphs = $xpath->query('//p');
foreach($paragraphs as $p)
{
    $ptext = $p->nodeValue;
    if(strpos($ptext, 'equanchor') !== false)
    {
        // get equation id from anchor
        preg_match('/equanchor\?\s\&id=`(.*)\`/', $ptext, $matches);
        $equationids[] = (int)$matches[1];
    }
}

现在我还需要 HTML 注释 中的文本,即&lt;!-- Gl. 1-4 --&gt;,但我不知道如何为此目的使用 DOM 解析器 (DomXPath)。不幸的是,$p-&gt;nodeValue$p-&gt;textContent 都包含评论文本。

This answer 没有帮助我。我尝试了一个“子解析器”,但它无法读取$ptext$p

【问题讨论】:

    标签: php domparser


    【解决方案1】:

    您可以使用comment() XPath 函数(来自Accessing Comments in XML using XPath)。

    因此,在您的情况下,当您想在&lt;p&gt; 标记中获取评论时,您只需添加该行...

    echo $dom->saveHTML($xpath->query("comment()", $p)[0]);
    

    在您的foreach 循环中(这会获取循环中$p 元素中的注释节点)。使用[0] 获取第一个(假设只有一个)。

    哪些输出...

    <!-- Gl. 1-4 -->
    

    【讨论】:

    • 可爱。非常感谢!我从来没有想过为此使用saveHTML()。 PS:添加了一个简单的$comment = str_replace(['&lt;!-- ', '--&gt;'], '', $comment); 以获取带有“Gl. 1-4”的内部文本。
    • 如果你只需要内容$comment = $xpath-&gt;query("comment()", $p)[0]-&gt;textContent;可能会更整洁。
    • saveHTML() 函数中不起作用。但是这个解决方案已经足够棒了:)
    • textContent 是 DOMNode 节点的属性,因此您无需将其转换回 HTML。
    猜你喜欢
    • 2014-08-19
    • 2012-11-02
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2011-09-11
    • 2011-08-31
    相关资源
    最近更新 更多