开启左侧

html正则表达式实例小结

[复制链接]
yuanscn 发表于 2023-11-8 06:46:41 | 显示全部楼层 |阅读模式

欢迎注册登录后浏览更多内容!谢谢!

您需要 登录 才可以下载或查看,没有帐号?注册

x
正则表达式之三去除网页标签

一、清除全部网页标签代码,只保留纯文本内容和js标签
        正则表达式:<[^<]+?>或<[^>]*>
二、清除脚本,中间内容也删除
      正则表达式:<script[^>]*?>.*?</script>、
      <img[^>]*>、<(?!br).*?>。
三、清除标签和标签中间的内容
      <table[^>]*?>.*?</table>   //去除table里面的所有内容
      <!--[^-]*-->、<!--.*?-->、<script[^>]*?>.*?</script>、<noscript[^>]*?>.*?</noscript>、<style[^>]*?>.*?</style>、<[\s\S]*?> //清除空格以外的所有网页标签及标签里的参数
四、保留所选标签,不进行处理
     <(?!img|br|p|/p|a|/a|table|/table|tr|/tr|td|/td|div|/div).*?>
五、获取图片网址
     <img\s+[^>]*\s*src\s*=\s*([']?)(?<url>\S+)'?[^>]*>
六、保留标签,只清除标签中的属性
    document.write(str.replace(/(<[^\s\/>]+)\b[^>]*>/gi,"$1>")); // 去除HTML标签中的属性
  普通正则公式:查:(<[^\s\/>]+)\b[^>]*>,替换:\1>

七、除!标记的图片和链接标签外,一律清除标签属性,只保留标签符号
    <((?!IMG|a|link|meta)[a-zA-Z]+)\s*[^><]*> //这里只保留img的属性,注意用<\1>替换,别的正则公式用<$1>替换。

八、查找闭合的标签,中间换行了不闭合的不能匹配
   <.+?>
九、匹配有换行的情况
   <p[^>]*>(.|\n)*<\/p>

十一、保留标签符号,但去掉指定(所有)标签的属性。
    指定:<(?!\/?img)[^<>]*>、<(?!\/?strong|\/?em|\/?p|\/?u)[^<>]*>、<[^<>]*>
    全部:<((?!IMG|a|link|meta)[a-zA-Z]+)\s*[^><]*>

十二、^符号的单行和多行中的不同用法
    比如:
    [^a-z\s]  //[]否定(取反)用法会匹配"my 3 sisters"中的"3"。后边这是限定开头用法:[(^\s+)(\s+$)]/g、
(^cat)$。
       这里的^的意思是字符类的否定,上面的正则表达式的意思是:匹配不是(a到z和空白字符)的字符。
    [^a]表示“匹配除了a的任意字符”。
    [^a-zA-Z0-9]表示“找到一个非字母、也非数字的字符”。
    [\^abc]表示“找到一个插入符或者a或者b或者c”。
    经过对比,只要是”^”这个字符是在中括号”[]”中被使用的话就是表示字符类的否定,如果不是的话就是表示限定开头。

十三、正则表达式的() [] {}有不同的意思。

  () 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。

  (\s*)表示连续空格的字符串。

  []是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。

  {}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s{1,3}表示匹配一到三个空格。

  (0-9) 匹配 '0-9′ 本身。 [0-9]* 匹配数字(注意后面有 *,可以为空)[0-9]+ 匹配数字(注意后面有 +,不可以为空){1-9} 写法错误。

  [0-9]{0,9} 表示长度为 0 到 9 的数字字符串。

十四、断言(正则表达式中?=和?:和?!的理解)(瞻前,顾后,不瞻前,不顾后四个概念)
   (?表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
   (?=)以 xxx(?=pattern)为例,就是捕获以pattern结尾的内容xxx。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。
   (?!)以 xxx(?!pattern)为例,就是捕获不以pattern结尾的内容xxx)。可匹配Windows3.1而不能Windows2000。
   (?<=)以(?<=pattern)xxx为例,就是捕获以pattern开头的内容xxx。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。
   (?<!)以(?<!pattern)xxx为例,就是捕获不以pattern开头的内容xxx。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。
  // 前瞻:exp1(?=exp2) 查找exp2前面的exp1。
  // 后顾:(?<=exp2)exp1 查找exp2后面的exp1。"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr。"法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到。
  // 负前瞻:exp1(?!exp2) 查找后面不是exp2的exp1
  // 负后顾:(?<!exp2)exp1 查找前面不是exp2的exp1
  正则如下:
  (?=.*(?:^|[,"])abc(?:[,"]|$))(?=.*(?:^|[,"])qq(?:[,"]|$))(?=.*(?:^|[,"])text(?:[,"]|$))(?=.*(?:^|[,"])abc_2(?:[,"]|$))(^.*$)

    解释:
        (?=.*(?:^|[,"])abc(?:[,"]|$))       #用零宽断言断言以后的内容里必须有字符串abc
        (?=.*(?:^|[,"])qq(?:[,"]|$))        #用零宽断言断言以后的内容里必须有字符串qq
        (?=.*(?:^|[,"])text(?:[,"]|$))      #用零宽断言断言以后的内容里必须有字符串text
        (?=.*(?:^|[,"])abc_2(?:[,"]|$))     #用零宽断言断言以后的内容里必须有字符串abc_2
        (^.*$)                                    #匹配整行字符串

    详细解释:
        (?=        #断言开始
        .*         #匹配数据前的内容
        (?:^|[,"]) #字符串的分隔符可以是行首,逗号或者引号(如果字符串中没有引号则可以去掉)
        abc        #需要匹配的内容
        (?:[,"]|$))#同(?:^|[,"]),表示数据结束的分隔符

十五、数字格式化
    "1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",") // 结果:1,234,567,890,匹配的是后面是3*n个数字的非单词边界(\B)
    $line =~ /\-?(?:\d+\.?\d*|\.\d+)/g 在perl中是什么意思?
        \-? 表示匹配正负数
        ?:表示以|为分隔,匹配\d+\.?\d* 或 \.\d+
        \d+\.?\d* 表示匹配整数或小数
        \.\d+ 表示匹配没有整数但有小数点的数
        g 表示全局匹配
        ?:表示括号只是起分隔作用,不将括号中匹配的内容存入内存中。因为如果不加?:的话,括号内匹配的内容会放入$1,$2...这些变量中$line =~/[\-\.\d]+/g
回复

使用道具 举报

快速回复 返回顶部 返回列表