我有一个包含 html 代码的表单,由于我无法禁用 MCE 编辑器的自动格式设置,该表单有时会变得有点困惑。
我已经用 PHP 做了一些简单的替换,但还有一些我不太确定。
删除全部 <span>
标签例如 <span style="font-family: inherit; font-weight: inherit; line-height: 1.3;">
包括他们的</span>
对应的内容,但不是这些标签内的内容。
例如:<span style="font-family: inherit; font-weight: inherit; line-height: 1.3;">StackOverflow</span>
会变成 StackOverflow
唯一不应该删除的是那些看起来像:
<span class="MainLink" style="font-weight: bold"><a href="https://website.com/" style="color: #2f82de; text-decoration: none">link name</a></span>
所以基本上任何封装 <a href...
链接。
任何想法如何做到这一点,我想我需要使用正则表达式来做到这一点,但可能有一个更简单/更好的方法。
最佳答案
要执行此操作,您需要一个解析器,而不是正则表达式(另请参阅 The Famous Answer 关于此内容)
从此示例开始 DOMDocument
和DOMXpath
:
$dom = new DOMDocument();
libxml_use_internal_errors(1);
$dom->formatOutput = True;
$dom->loadHTML( $html );
$xpath = new DOMXPath( $dom );
while( $node = $xpath->query( '//span[not(contains(@class,"MainLink"))]' )->item(0) )
{
$fragment = $dom->createDocumentFragment();
while( $node->childNodes->length )
{
$fragment->appendChild( $node->childNodes->item(0) );
}
$node->parentNode->replaceChild( $fragment, $node );
}
echo $dom->saveHTML();
用这一行:
while( $node = $xpath->query( '//span[not(contains(@class,"leave"))]' )->item(0) )
您搜索每个 <span>
class
中不包含“leave”的节点属性:如果找到此模式( ->item(0)
),则执行循环。
然后您创建一个新的 DOMDocumentFragment
,一个特殊的临时节点,您可以在其中添加所有子节点:
while( $node->childNodes->length )
{
$fragment->appendChild( $node->childNodes->item(0) );
}
将所有子节点移动到新片段后,替换空 <span>
带有片段的节点。
其他可以帮助您的有用 XPath:
-
//span[not(a)]
:全选<span>
节点后面没有<a>
child ; -
//span[not(contains(@class,"leave")) and not(contains(@class,"yes"))]
:全选<span>
class
中没有“leave”或“yes”的节点属性。
关于php - 通过 PHP 有选择地替换某些 HTML 标签,同时保留一些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36096834/