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).*?>
使用替换字符串:
<>
$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);
我正在 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).*?>
使用替换字符串:
<>
$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);