欢迎注册登录后浏览更多内容!谢谢!
您需要 登录 才可以下载或查看,没有帐号?注册
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 |