我需要从任意字符串html中

时间:2015-07-17 12:01:29

标签: php html regex

HTML首先通过净化器运行(tinyMCE + Wordpress),因此它应该与某些标准形式匹配。所有脚本和样式标签都被剥离,标签内的所有数据都是html_encoded,因此不需要担心无关的符号。

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

就我可以分解而言,似乎有问题的模式可以分解为逻辑组件:

  1. /<[a-zA-Z][^>]+ - 匹配任何html标记的开头以及其中的任何标记和属性组合,但不包括结束括号
  2. (?i:class)=\" - 类属性的开头,不区分大小写
  3. (?: - 启动非捕获子模式
  4. (?: *[a-zA-Z_][\w-]* +)* - 任意数量的类名(或无),但如果存在,则在捕获之前必须有空格
  5. ( *。implode('|',$ classes)。*) - 要捕获的类集,preg_quoted
  6. (?: +[a-zA-Z_][\w-]* *)* - 任意数量的类名(或无),但如果存在,则捕获后必须有空格
  7. )+ - 关闭非捕获子模式并循环它以防多个匹配类在一个属性中
  8. \"(?: [^>]*)>/ - 类属性的结尾,以及html标记末尾的所有内容
  9. 制作最终的正则表达式:

    $pattern = "/<[a-zA-Z][^>]+ (?i:class)=\"(?:(?: *[a-zA-Z_][\w-]* +)*( *".implode('|', $classes)." *)(?: +[a-zA-Z_][\w-]* *)*)+\"(?: [^>]*)>/";
    

    我还没有尝试过运行它,因为我知道它是否有效,我会非常想要使用它,但通过preg_replace运行它似乎应该可以完成这项工作,除了一个小问题。我相信它会在捕获区域周围留下无关的空白。这不是一个重要问题,但如果有人知道如何,可能会避免这种情况。

    还应该注意的是,这不是一个关键任务的过程,如果我的捕获偶尔无法移除类,那么没有人会死。

    所以,实质上......有人可以解释在这种情况下是什么让这个坏主意?

2 个答案:

答案 0 :(得分:0)

好的,那是你要从给定的html中删除的类名列表吗?

我想说的是,您要删除的给定类名列表是什么。你能给出一个典型的html的例子,它是什么,以及你想要改变它的内容。 例如:

   if(re.IsMatch(seg.status)){ //...  }

更改为

<div class="someClass">
  <i class="dontchange doChange"></i>
  <a class="hello john"></a>
</div>

答案 1 :(得分:-1)

这将替换所有html中的所有类。

myHtml.replace(/class\=\"[^\"]*\"/g,'');

这是你在找什么?还是更具体的东西?