PHP 正则表达式:尝试删除属性样式“...”,但只删除 <p> 和 <span> 标签内的属性

PHP Regular expression: try to remove attributes style"..." but only those inside <p> and <span> tags

我正在 PHP 中寻找一个正则表达式,它从 "p" 和 "span" 标签中删除所有样式属性,但保留 "td" 中的样式属性等不变.

我现在有这个:(它找到所有 style="..." 东西)

$pattern = '[style=("[^"]*")]';
$content = '<td style="blabla">
               <p style="blabla">
                    text <span style=blabla">more text</span>
               </p>
            </td>';

用于 preg_replace()

$newcontent = preg_replace($pattern, '', $content);

但这也删除了 td 中的样式,我不希望这样。

所以最后替换后我想要

<td style="blabla">
    <p>text <span>more text</span>
    </p>
</td>

众所周知,您不应该 parse/traverse/modify xml 或 html 使用正则表达式,理想情况下您应该使用 html/xml 解析器。

但是,如果您不想使用解析器,则可以使用如下简单的正则表达式:

<(p|span).*?>

使用替换字符串:

<>

Working demo

$re = '/<(p|span).*?>/';
$str = '<td style="blabla">
               <p style="blabla">
                    tekst <span style=blabla">more text</span>
               </p>
            </td>';
$subst = '<\1>';

$result = preg_replace($re, $subst, $str);

这是一个使用 DomDocument 而不是正则表达式的非常简单的示例。

$doc = new DomDocument();
$doc->loadHtml($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
foreach (['p', 'span'] as $tag) {
    foreach ($doc->getElementsByTagName($tag) as $node) {
        $node->removeAttribute('style');
    }
}
$result = $doc->saveHtml();

您可能不需要 LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD 选项,具体取决于您的实际内容,但对于此特定示例而言需要这些选项。

这是模式:

<(p|span)\s+[\w"=\(\);'}{ ]*style=("[^"]*")

它甚至适用于 html 像这样:

<span data="data" style="abc"></p>
<p id="test" onclick="test({'name'});" style="abv"></p>
<td style="abvc"></td>
<span></span>
<tr style="abc"></tr>
<p style="bcd"></p>

嗨,我在 java 脚本中得到了类似的东西。由于它们是 HTML

,所以我使用控制台将我的结果放在剪断中

var str = "<td style=\"blabla\"><p style=\"blabla\">text <span style=\"blabla\">more text</span></p></td>";
str = str.replace(/((<p|<span)[^])(style{1}={1}"{1}[^"]+"{1})/g, "");
console.log(str);

RegEx 是 ((<p|<span)[^])(style{1}={1}"{1}[^"]+"{1})然后您可以替换第二组以摆脱带有 <p><span> 标签的样式。我进行了少量测试,并尝试使 RegEx 尽可能具体,以避免删除不正确的内容。 .希望对您有所帮助。

回到我自己的老问题,诀窍是使用组捕获。所以组在 ( ) 之间,之后可以用作 '$1' 等。在这个例子中,我们有 3 个组 (group1)(group2)(group3) 作为 $1$2$3

$txt = '<td style="abc">
           <p id="test" style="abc"></p>
        </td>';
$txt = preg_replace('/(<p\s.*style=")(.*)(")/', "", $txt);

结果是

<td style="abc">
    <p width="5" style=""></p>
</td>

以下对我有用:

$text = preg_replace('/style=\"[^\"]*\"/', '',$text);