【问题标题】:How to strip a HTML element from a text file with PHP?如何使用 PHP 从文本文件中去除 HTML 元素?
【发布时间】:2022-02-02 14:58:15
【问题描述】:

我正在清理 ePub 文件的 Adob​​e InDesign 导出功能造成的混乱。

我的目标: 选项 1. 我想删除所有具有类属性 CharOverride-7span 元素,但保留其他 span 元素。 选项 2. 在某些情况下,我想将 span.CharOverride-7 替换为新元素,例如 i

请注意,我目前手动且耗时的方式是进行批量搜索和替换操作,但输入的文本文件不一致(额外的空格和其他工件)。

输入文本包含数百个p 段落,如下所示:

    <p class="2"><span class="CharOverride-7">A book title</span><a href="https://aaa.net"><span class="CharOverride-8">https://aaa.net</span></a><span class="CharOverride-7">.</span></p>

    <p class="2"><span class="CharOverride-7">Another book title</span><a href="https://aaa.net"><span class="CharOverride-8">https://aaa.net/</span></a><span class="CharOverride-7">.</span></p>

所需的输出应如下所示:

选项一(删除元素)

<p class="2">A book title<a href="https://aaa.net/"><span class="CharOverride-8">https://aaa.net/</span></a>.</p>

选项二(将 span.CharOverride 替换为 i 元素)

<p class="2"><i>A book title</i><a href="https://aaa.net/"><span class="CharOverride-8">https://aaa.net</span></a><i>.</i></p>

【问题讨论】:

  • 可能会使用 xpath 定位所有 span.CharOverride-7。你试过什么了?我会转换为i(或emstrong)。
  • 使用DOMDocument解析文件。然后你可以使用它的方法找到你想要的元素,替换它们,并写出更新后的 HTML。

标签: php html element


【解决方案1】:

对于选项一,这种方式适用于使用 DOMDocument():https://www.php.net/manual/de/class.domdocument.php

<?php
$yourHTML = '<p class="2"><span class="CharOverride-7">A book title</span><a href="https://aaa.net"><span class="CharOverride-8">https://aaa.net</span></a><span class="CharOverride-7">.</span></p>';
$dom      = new DOMDocument();
$dom->loadHTML($yourHTML, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED );

foreach ($dom->getElementsByTagName('span') as $span) {
    if ($span->attributes["class"]->value == "CharOverride-7") {
        $newelement = $dom->createTextNode($span->textContent);
        $span->parentNode->replaceChild($newelement, $span);
    }
}

$ret = $dom->saveHTML();

// <p class="2">A book title<a href="https://aaa.net"><span class="CharOverride-8">https://aaa.net</span></a>.</p>
echo $ret;

【讨论】:

  • @user3783243 很酷 - 不知道这个选项。我更新了我的答案!
  • 很好的答案。谢谢!!
【解决方案2】:

这是使用preg_replace()的简单方法...

<?php

$data = file_get_contents('[YOUR FILENAME HERE]');

$result1 = preg_replace('/<span class="CharOverride-7">(.*)<\/span>/U', '$1', $data);
//$result2 = preg_replace('/<span class="CharOverride-7">(.*)<\/span>/U', '<i>$1</i>', $data);

echo $result1; 
// echo $result2;

// Overwrite your file here... (Beyond scope of this question)

请随意使用$result1$result2

Regex101 Sandbox

【讨论】:

  • 考虑 &lt;span class="other class CharOverride-7"&gt;&lt;span class='CharOverride-7'&gt;&lt;span id="class7" class="CharOverride-7"&gt;,作为失败的三个快速示例。正则表达式不适用于 HTML,如果可以,它们必须是广泛的,并且在已知数据集(基于 OP 语句,the input text file is inconsistent ,他们没有)
  • 我完全不同意。这与提供的场景完美配合。
  • 是的,这个解决方案也有效。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 2010-11-23
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多