Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我需要从任意html字符串中快速删除一组类_Php_Html_Regex - Fatal编程技术网

Php 我需要从任意html字符串中快速删除一组类

Php 我需要从任意html字符串中快速删除一组类,php,html,regex,Php,Html,Regex,HTML首先通过一个净化器(tinyMCE+Wordpress)运行,因此它应该与一些标准表单相匹配。所有的脚本和样式标记都被剥离,标记中的所有数据都是html_编码的,所以没有多余的符号需要担心 我知道用正则表达式解析html的一般立场是“不要”,但在这个具体的例子中,问题似乎不像解析,更像是简单的字符串处理。。。我是否错过了某种看不见的复杂程度 据我所知,这一模式似乎可以分解为逻辑组件: /]+-匹配任何html标记的开头以及其中标记和属性的任何组合,但不匹配结束括号 (?i:class)=

HTML首先通过一个净化器(tinyMCE+Wordpress)运行,因此它应该与一些标准表单相匹配。所有的脚本和样式标记都被剥离,标记中的所有数据都是html_编码的,所以没有多余的符号需要担心

我知道用正则表达式解析html的一般立场是“不要”,但在这个具体的例子中,问题似乎不像解析,更像是简单的字符串处理。。。我是否错过了某种看不见的复杂程度

据我所知,这一模式似乎可以分解为逻辑组件:

  • /]+
    -匹配任何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_替换来清理这些属性