2012-03-20 32 views
2

我有这样的HTML代码:PHP正则表达式去除MSO标签

$html = "<P style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; padding: 4px;" class=MsoNormal>text</P>"; 

我需要删除所有mso- *标记,结果将是:

$html = "<P style="padding: 4px;" class=MsoNormal>text</P>"; 

我怎么做PHP的? 非常感谢

+0

的可能重复[PHP来清理粘贴微软输入(HTTP://计算器.com/questions/379342/php-to-clean-up-pasted-microsoft-input) – 2012-03-20 11:37:36

+0

@Pekka不是一个好的重复imo。它基本上只是说使用HTMLPurifier或Tidy,并且只有一个答案。 – Gordon 2012-03-20 11:42:00

+1

@戈登我猜这取决于OP真正想要什么。如果他想清理所有微软的东西,HTMLPurifier确实是我所知道的最好的方法。如果他想要*完全*他在上面显示的内容(而没有其他内容),则不同。 – 2012-03-20 11:43:55

回答

-1

代码:

$html = "<p style='mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; padding: 4px;' class=MsoNormal>text</P>"; 

$cleanHtml = preg_replace('(mso-[a-z\-: ]+;)i', '', $html); 

echo $cleanHtml; 

输出:

<P style='padding: 4px;' class=MsoNormal>text</P> 
3

这会工作:

echo preg_replace(
    '(
     mso- # match anything with the mso vendor prefix 
     .+? # followed by at least one character 
     ;  # up to the first semicolon 
     [ ]* # and an optional space 
    )xi', 
    '',  // replace that match with nothing 
    $html 
); 

但是,如果有更多的只是HTML中的一行$html,看看Grabbing the href attribute of an a element学习如何容易和可靠地获取从属性html中的元素。然后使用上面的正则表达式来替换节点值。

+0

http://codepad.org/AaajCxvk - 我很高兴我得到了与专家一样的答案! – jon 2012-03-20 11:46:46

0

你也可以试试这个;

(mso-[^:]*:[^;]*;) 

但是,不要忘了不与正则表达式解析HTML,这是一个非常大的罪!

0
preg_replace('/mso-.+?:\s*?.+?;/s', '', $html); 
0
<?php 
$string = '<P style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; padding: 4px;" class=MsoNormal>text</P>'; 
$patterns = '/mso-(.*?);/'; 
$replacements = ''; 
echo preg_replace($patterns, $replacements, $string); 
?> 
0

我测试过Dr.Kameleon的解决方案:它工作正常,但它不不适用于所有情况。例如,对于下面的代码,mso- *属性不会删除:

<p style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto' class=MsoNormal>text</P> 

(我删除一些空格和“”)。

所以,我建议你Dr.Kameleon的代码的一些改进:

$cleanHtml = preg_replace('(mso-[a-z0-9\s\-:;]+)i', '', $html); 

最佳方面