从段落标记中删除样式属性

时间:2014-07-31 00:31:30

标签: php html regex

我发现这个正则表达式会从标签中删除样式属性。

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

我自己尝试修改正则表达式,但是我无法绕过这个并且我的正则表达式失败了。

3 个答案:

答案 0 :(得分:3)

(* SKIP)(* F)和\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>