我发现这个正则表达式会从标签中删除样式属性。
$content = preg_replace('/(<[^>]+) style=".*?"/i', '$1', $_POST['content']);
它完美无缺,但我正在尝试找到一种仅从段落<p>
标签中剥离样式的解决方案:
<h1 style="font: times">Hello</h1>
<p style="font: verdana">World</p>
会变成
<h1 style="font: times">Hello</h1>
<p>World</p>
我自己尝试修改正则表达式,但是我无法绕过这个并且我的正则表达式失败了。
答案 0 :(得分:3)
\K
关于使用正则表达式解析html的所有免责声明,您可以使用此正则表达式:
<(?!p)[^>]*>(*SKIP)(*F)|<p[^>]*\Kstyle\s*=\s*"[^"]*"
请参阅 the Regex Demo 底部的替换。
示例PHP代码
$replaced = preg_replace('~<(?!p)[^>]*>|<p[^>]*\Kstyle\s*=\s*"[^"]*"~',
'',
$yourstring);
<强>解释强>
此问题是此问题中向"regex-match a pattern, excluding..."
解释的技术的典型案例交替|
的左侧匹配完成<non-p tags>
然后故意失败,之后引擎跳到字符串中的下一个位置。右侧匹配样式,我们知道它们是正确的,因为它们与左侧的表达不匹配。
参考
答案 1 :(得分:2)
只需在捕获的群组中添加p\b
,以确保只选择了p
(但不是pre
):
$content = preg_replace('/(<p\b[^>]*) style=".*?"/i', '$1', $_POST['content']);
答案 2 :(得分:2)
避免使用正则表达式并使用正确的tool来完成作业......
$html = <<<DATA
<h1 style="font: times">Hello</h1>
<h2 style="font: times">Hello</h2>
<p style="font: verdana">World</p>
DATA;
$dom = new DOMDocument;
$dom->loadHTML($html); // Load your HTML
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//p[@style]') as $node) {
$node->removeAttribute('style');
}
echo $dom->saveHTML();
输出
<h1 style="font: times">Hello</h1>
<h2 style="font: times">Hello</h2>
<p>World</p>