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