我只是想知道是否有人知道从 php 中的字符串中删除所有类的函数。基本上我只想要
<p>
标签而不是
<p class="...">
如果这是有道理的:)
一个相当天真的正则表达式可能对你有用
$html=preg_replace('/class=".*?"/', '', $html);
我说天真,因为如果您的正文由于某种原因碰巧包含 class="something" ,它就会失败!。如果需要,可以通过在尖括号标签内查找 class="" 来使其更加健壮。
也许这对您的需求来说有点矫枉过正,但是,要解析/验证/清理 HTML 数据,我知道的最好的工具是HTML Purifier
它允许您定义哪些标签和哪些属性是可以的;和/或哪些不是;它提供有效/干净的 (X)HTML 作为输出。
(使用正则表达式“解析”HTML 一开始似乎还可以……然后,当您想添加特定的东西时,理解/维护通常会变得很糟糕)
您将 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 元素标签中有换行符,试图关闭它可能会导致问题。但是给其中任何一个机会。
由于可以编写或格式化代码的数百种不同方式,因此 HTML 对正则表达式可能非常棘手。
HTML 净化器是一个成熟的HTML 净化开源库。我会建议在这种情况下使用它。
在 HTML 净化器的配置文档中,您可以指定应该允许的类和属性,以及净化器在找到它们时应该做什么。
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html);
如果您要针对 Microsoft Office 导出的 HTML 进行测试,您需要的不仅仅是删除类,但HTML Tidy有一个仅适用于 Microsoft Office的配置标志!
否则,这应该比其他一些答案更安全,因为它们有点贪婪并且您不知道将使用哪种封装('
或"
)。
注意:该模式实际上是/\sclass=['|"][^'"]+['|"]/
但是,因为有两个引号 ( "
) 撇号 ( '
),我不得不转义所有出现的一个 ( \'
) 来封装该模式。
我会在 jQuery 上做这样的事情。把它放在你的页眉中:
$(document).ready(function(){
$(p).each(function(){
$(this).removeAttr("class");
//or $(this).removeclass("className");
})
});