php - 通过 PHP 有选择地替换某些 HTML 标签,同时保留一些

标签 php regex replace preg-replace

我有一个包含 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 关于此内容)

从此示例开始 DOMDocumentDOMXpath :

$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/

相关文章:

php - PSR-2 数组和方法链接的编码标准?

php - 如何获取很久以前提出的查询的 ID 并将其发布到另一个表?

python - 这个正则表达式是什么意思?

javascript - jQuery - 单击列表时替换 div 类

php - Ajax 调用嵌套的 php 文件

php - MySql 性能缓慢

regex - 通过正则表达式从字符串获取价格(仅金额,没有货币标签,没有特殊字符)

ios - 如何使用正则表达式检查私有(private)/本地 IP 地址

c# - 如何正确替换数组中的对象 - C#

vim - 如何在 vim 中的搜索和替换中操作字符大小写?