2009-07-23 66 views
6

,如果任何人知道一个函数从PHP中的字符串中删除所有类我只是想知道..基本上我只想条从p标签的所有类

<p> 

标签,而不是

<p class="..."> 

如果是有道理的:)

回答

8

一个相当幼稚的正则表达式可能会为你工作

$html=preg_replace('/class=".*?"/', '', $html); 

我说天真,因为如果你的身体文本碰巧包含class =“something”出于某种原因它会失败!如果需要的话,可以通过在角标托架标签内查找class =“”来使它更加健壮。

+0

非常感谢,像一个魅力的作品:) – SoulieBaby 2009-07-23 10:43:54

+0

该代码是否可以处理大写/小写,单/双/不加引号,空格之间,空格之前和之后的类? – 2009-07-23 11:17:22

+0

否 - 仅限OP所指示的情况。其他任何东西都留给读者练习:) – 2009-07-23 12:45:33

1

我会在jQuery上做这样的事情。将其放置在页面页眉中:

$(document).ready(function(){ 
$(p).each(function(){ 
    $(this).removeAttr("class"); 
    //or $(this).removeclass("className"); 
}) 

});

2

也许这是你需要有点大材小用,但是,解析/验证/洁净HTML数据,最好的工具,我所知道的是HTML Purifier

它允许您定义的标签,以及哪些属性,都行;和/或哪些不是;并提供有效的/ clean(X)HTML作为输出。

(使用正则表达式来“解析” HTML似乎的OK开始......然后,当你想添加特定的东西,它通常变成地狱理解/维护)

2

您加载HTML到DOMDocument类中,将其加载到simpleXML中。然后,对所有p元素执行XPath查询,然后遍历它们。在每个循环中,将类属性重命名为“killmeplease”。

完成后,将simpleXML重新输出为XML(顺便说一句,可能会更改HTML,但通常只会更好),并且您将拥有一个HTML字符串,其中每个p都有一个“killmeplease”类。使用str_replace实际删除它们。

例子:

$html_file = "somehtmlfile.html"; 

$dom = new DOMDocument(); 
$dom->loadHTMLFile($html_file); 

$xml = simplexml_import_dom($dom); 

$paragraphs = $xml->xpath("//p"); 

foreach($paragraphs as $paragraph) { 
    $paragraph['class'] = "killmeplease"; 
} 

$new_html = $xml->asXML(); 

$better_html = str_replace('class="killmeplease"', "", $new_html); 

或者,如果你想使代码更简单,但用了preg_replace纠结,你可以一起去:

$html_file = "somehtmlfile.html"; 
$html_string = file_get_contents($html_file); 

$bad_p_class = "/(<p).*(class=.*)(\s.*>)/"; 

$better_html = preg_replace($bad_p_class, '$1 $3', $html_string); 

最棘手的部分用正则表达式是他们往往如果你的p元素标签中有一个换行符,那么贪婪并试图关闭它可能会导致问题。但给那些一个镜头。

1

HTML过滤

HTML可以是非常棘手的,因为数百种不同的方式可以编写代码或格式化,以正则表达式。

HTML purifier是一个成熟的清理HTML的开源库。我会建议在这种情况下使用它。

在HTML净化器的配置文档中,您可以指定应该允许的类和属性以及净化器在发现它们时应该执行的操作。

http://htmlpurifier.org/docs/

2
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";  
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html); 

如果你正在投入对微软Office的出口HTML的测试,你需要比类去除但HTML Tidy更加刚刚为Microsoft Office config flag

否则,这应该是比其他答案更安全,因为他们有点贪婪,你不知道将使用什么样的封装('")。

注:模式实际上是/\sclass=['|"][^'"]+['|"]/但是,因为有两个引号(")撇号('),我不得不逃离一个(\')所有出现的封装模式。