如何使用 PHP 从文本文件中删除 HTML 元素?
How to strip a HTML element from a text file with PHP?
我正在清理由 ePub 文件的 Adobe InDesign 导出功能造成的混乱。
我的目标:
选项 1. 我想删除所有具有 class 属性 CharOverride-7
的 span
元素,但保留其他 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>
对于选项一,这种方式适用于使用 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;
这里有一个简单的方法供您使用 preg_replace()...
<?php
$data = file_get_contents('[YOUR FILENAME HERE]');
$result1 = preg_replace('/<span class="CharOverride-7">(.*)<\/span>/U', '', $data);
//$result2 = preg_replace('/<span class="CharOverride-7">(.*)<\/span>/U', '<i></i>', $data);
echo $result1;
// echo $result2;
// Overwrite your file here... (Beyond scope of this question)
请随意使用 $result1
或 $result2
。
我正在清理由 ePub 文件的 Adobe InDesign 导出功能造成的混乱。
我的目标:
选项 1. 我想删除所有具有 class 属性 CharOverride-7
的 span
元素,但保留其他 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>
对于选项一,这种方式适用于使用 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;
这里有一个简单的方法供您使用 preg_replace()...
<?php
$data = file_get_contents('[YOUR FILENAME HERE]');
$result1 = preg_replace('/<span class="CharOverride-7">(.*)<\/span>/U', '', $data);
//$result2 = preg_replace('/<span class="CharOverride-7">(.*)<\/span>/U', '<i></i>', $data);
echo $result1;
// echo $result2;
// Overwrite your file here... (Beyond scope of this question)
请随意使用 $result1
或 $result2
。