Php 我需要从任意html字符串中快速删除一组类
HTML首先通过一个净化器(tinyMCE+Wordpress)运行,因此它应该与一些标准表单相匹配。所有的脚本和样式标记都被剥离,标记中的所有数据都是html_编码的,所以没有多余的符号需要担心 我知道用正则表达式解析html的一般立场是“不要”,但在这个具体的例子中,问题似乎不像解析,更像是简单的字符串处理。。。我是否错过了某种看不见的复杂程度 据我所知,这一模式似乎可以分解为逻辑组件:Php 我需要从任意html字符串中快速删除一组类,php,html,regex,Php,Html,Regex,HTML首先通过一个净化器(tinyMCE+Wordpress)运行,因此它应该与一些标准表单相匹配。所有的脚本和样式标记都被剥离,标记中的所有数据都是html_编码的,所以没有多余的符号需要担心 我知道用正则表达式解析html的一般立场是“不要”,但在这个具体的例子中,问题似乎不像解析,更像是简单的字符串处理。。。我是否错过了某种看不见的复杂程度 据我所知,这一模式似乎可以分解为逻辑组件: /]+-匹配任何html标记的开头以及其中标记和属性的任何组合,但不匹配结束括号 (?i:class)=
/]+
-匹配任何html标记的开头以及其中标记和属性的任何组合,但不匹配结束括号(?i:class)=\”
-类属性的开头,不区分大小写(?:
-启动非捕获子模式(?:*[a-zA-Z!][\w-]*+)*
-任意数量的类名(或无),但如果它们存在,则在捕获之前必须有空格(*
。内爆('|',$classes)。*)
-要捕获的类集,引用(?:+[a-zA-Z!][\w-]**)
-任意数量的类名(或无),但如果它们存在,则捕获后必须有空格)+
-如果一个属性中有多个匹配类,请关闭非捕获子模式并循环它\”(?:[^>]*)>/
-类属性的末尾,以及html标记末尾的所有内容$pattern = "/<[a-zA-Z][^>]+ (?i:class)=\"(?:(?: *[a-zA-Z_][\w-]* +)*( *".implode('|', $classes)." *)(?: +[a-zA-Z_][\w-]* *)*)+\"(?: [^>]*)>/";
$pattern=“/”+(?i:class)=\”(?:(?:*[a-zA-Z\[\w-]*+)*(*”。内爆(“|”),$classes)。“*)(?:+[a-zA-Z\\w-]*)+\”(?:[^>]*)>/”;
我还没有试过运行它,因为我知道如果它能工作,我会很想使用它,但是通过preg\u replace
运行它似乎应该可以完成任务,除了一个小问题。我相信它会在捕获区域周围留下无关的空白。这不是一个重要的问题,但如果有人知道如何避免的话,这可能是一个不错的选择
还应该注意的是,这不是一个任务关键型的过程,如果我的捕获偶尔无法删除类,那么没有人会死亡
所以,本质上。。。有人能解释一下在这种情况下这是一个坏主意吗?这将替换所有html中的所有类
myHtml.replace(/class\=\"[^\"]*\"/g,'');
这就是你要找的吗?或者更具体一些?好的,这是要从给定html中删除的类名列表吗 我的意思是,你想要删除的类名列表是什么。你能给出一个典型html的例子,它是什么,你想把它改成什么吗。 例如: 以前
<div class="someClass">
<i class="dontchange doChange"></i>
<a class="hello john"></a>
</div>
改为
<div>
<i class="dontchange"></i>
<a></a>
</div>
复杂性在于:类
属性的开头只能与\b类
匹配,类名可以包含很多东西-但也许你知道你在做什么,preg\u quote
在边界处有单词字符时有效,如果没有,是否有效?如果
未被实体化(class=“dd>”
),该怎么办?@Stribizev-类名中类似
的边缘案例将在进入该代码之前由消毒剂过滤和删除,并且很高的期望是接收到的代码将由逻辑脚本生成,以便引导。但是,我不确定我是否关注class属性的问题。。。详细说明@罗伯特-我担心速度。这种修改需要在每次页面加载时运行(我知道,但我在很多方面都受到限制),并且将html解析为DOM对象比正则表达式引擎占用的内存/cpu要多得多。或者,如果存在一个非常不寻常的edgecase,其中class=”“不存在于标记中,则可以这样做:myHtml.replace(/(]*)class\=\“[^\”]*\“/g,$1”);不,尝试只替换给定列表中出现的类,而不希望匹配所有类给定列表是什么?它将是一个preg_转义字符串列表,可能会从使用变为使用…在任何正则表达式中,它们在功能上应等同于(str1 | str2 | str3)
。我打算逐个填充类名列表,但它们将是一组已转义的字符串文字,用于正则表达式。要删除的类名在功能上等同于(str1 | str2 | str3).你的例子是准确的,虽然我不需要删除空的类属性…在最坏的情况下,我可以在事后用str_替换来清理这些属性