Php 从p标记中删除所有类

Php 从p标记中删除所有类,php,class,strip,Php,Class,Strip,我只是想知道是否有人知道一个函数可以在php中从字符串中删除所有类。。基本上我只想要 <p> 标签而不是 <p class="..."> 如果这有意义的话:)一个相当幼稚的正则表达式可能适合您 $html=preg_replace('/class=".*?"/', '', $html); 我之所以说“天真”,是因为如果您的正文由于某种原因碰巧包含class=“something!”,它将失败!。如果需要的话,可以通过在带角括号的标记中查找class=”“,

我只是想知道是否有人知道一个函数可以在php中从字符串中删除所有类。。基本上我只想要

<p> 

标签而不是

<p class="...">


如果这有意义的话:)

一个相当幼稚的正则表达式可能适合您

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

我之所以说“天真”,是因为如果您的正文由于某种原因碰巧包含class=“something!”,它将失败!。如果需要的话,可以通过在带角括号的标记中查找class=”“,使其更加健壮。

我会在jQuery上做类似的操作。将其放在页面标题中:

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

}))

对于您的需求来说,这可能有点过分,但是,要解析/验证/清理HTML数据,我所知道的最好的工具是

它允许您定义哪些标记和属性是可以的;和/或哪些不是;它将有效/干净(X)HTML作为输出


(使用正则表达式“解析”HTML在开始时似乎还可以……然后,当您想要添加特定内容时,理解/维护通常会变得非常困难)

将HTML加载到DOMDocument类中,将其加载到simpleXML中。然后对所有p元素执行XPath查询,然后循环遍历它们。在每个循环中,将class属性重命名为“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);
$html\u file=“somehtmlfile.html”;
$html\u string=file\u get\u contents($html\u file);
$bad_p_class=“/(
正则表达式的棘手之处在于它们往往是贪婪的,如果您的p元素标记中有换行符,那么尝试关闭它可能会导致问题。但是试一下这两种方法。

HTML净化器 HTML对于正则表达式来说非常棘手,因为有数百种不同的代码编写或格式化方式

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

在HTML净化器的配置文档中,您可以指定应该允许的类和属性,以及净化器在找到它们时应该做什么

$html=“

”; preg|u replace('/\sclass=[\'\\\'“][^\'”]+[\'\'\\'“]/',''$html);

如果要对Microsoft Office导出的HTML进行测试,您需要删除的不仅仅是类,还有一个仅适用于Microsoft Office的测试

否则,这应该比其他一些答案更安全,因为它们有点贪婪,并且您不知道将使用何种封装(


注意:该模式实际上是
/\sclass=['\'“][^']+['\'”]/
但是,由于有两个倒逗号(
)撇号(
),我必须避免出现一个(
\'
)来封装该模式。

不是PHP,但更好的解决方案不知道OP为什么要这样做,但不知道如何做才能更好。不是更好,只是其他方法:)如果我错了,请纠正我,但是真正的XML解析器使用的词法分析器不是用正则表达式将XML分开吗?我认为真正的问题是,当人们尝试自己做正则表达式解析器时,他们会尝试跳转到字符串的中间或结尾,而不是像真正的解析器那样从字符串的开头开始。我不认为他们这样做--不确定,但是。。。看起来很奇怪。不管怎么说,即使是这样,它们也可能比你为自己的项目编写的正则表达式更容易测试(因为它们被广泛使用)。这些代码是否适用于大写/小写、单引号/双引号/无引号、中间空格、,类前后的空格?否-仅限OP指示的情况。其他内容留给读者作为练习:)不要在HTML中使用正则表达式。而是使用PHP简单HTML DOM解析器库。
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";    
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html);