正则表达式解释

jeujeujeu 2018-06-20 07:54:57
$class为php字符串变量
第一个/<ul class=\"$class\">(.*?)<\/ul>/is
第二个/<div class=\"$class\".*?>.*?<\/div>/ism
第三个/<a href=\"(.*?)\".*?>(.*?)<\/a>/i
第四个/<img.+src=\"?(.+\.(jpg|gif|bmp|bnp|png))\"?.+>/i
第五个/<img.*title\=[\"|\'](.*)[\"|\'].*>/i
第六个/<\s*img\s+[^>]*?'.$attr.'\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i
第七个/<span>(.*?)<\/span>/i
第八个 class=\"$class\">(.*?)<\/span>/i

请问分别表示什么意思呢?谢谢
...全文
501 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
太感谢老顾了。去看了文盲老顾的博客,其中关于正则的文章,是我认为目前为止搜索到的最好的文章了。特别有帮助https://blog.csdn.net/superwfei/article/details/51753127 可以留一个联系方式吗?可能需要你帮我写一些正则表达式。有偿的。csdn以前好像有私信,现在没有找到可以私信的地方。
文盲老顾 2018-06-20
  • 打赏
  • 举报
回复
第八个 class=\"$class\">(.*?)<\/span>/i
以贪婪模式匹配第一个出现class="$class"的标签到最后一个/span之间的内容,并将之间的内容扔到分组1

https://blog.csdn.net/superwfei/article/details/51753127

这个是我对正则的理解,按用途整理的
文盲老顾 2018-06-20
  • 打赏
  • 举报
回复
第一个/<ul class=\"$class\">(.*?)<\/ul>/is
(.*?) ,因为有修饰s,所以.为所有字符,含换行,因为php默认正则为非贪婪模式,且该正则未加U进行修饰,所以长度后跟随?表示贪婪默示
例如字符串<ul class="$class"><ul class="$class">...</ul></ul>符合正则,且分组一的内容为<ul class="$class">...</ul>

第二个/<div class=\"$class\".*?>.*?<\/div>/ism
嗯,除了没有分组,其他的和第一个差不多
示例:<div class="$class">......</div>

第三个/<a href=\"(.*?)\".*?>(.*?)<\/a>/i
示例:<a href="http://baidu.com" title="百度">百度一下</a> 分组1的值是“http://baidu.com" title="百度”,分组2的值是“百度一下”

第四个/<img.+src=\"?(.+\.(jpg|gif|bmp|bnp|png))\"?.+>/i
嗯,以非贪婪模式匹配图片链接地址及扩展名

第五个/<img.*title\=[\"|\'](.*)[\"|\'].*>/i
以非贪婪模式匹配具有 title 属性的 img 标签,需要注意的是,在此之前的正则都是用.来定义字符集,所以存在跨标签的可能

第六个/<\s*img\s+[^>]*?'.$attr.'\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i
\s部分以非贪婪模式匹配,[^>]字符集以贪婪模式匹配
匹配一个img标签(未必是合法的标签,因为img前可能出现多个空格),标签内必须出现'.$attr.'属性(注意,由于没有转义,所以这里的.也可以代替其他符号),且该属性有单引号或双引号括起来的值,值部分以贪婪模式匹配直到最后一个对应的单引号或双引号

第七个/<span>(.*?)<\/span>/i
以贪婪模式匹配第一个span到最后一个/span标签之间的内容,并将之间的内容扔到分组1里

jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
随便说一个就可以,大家一个人说一个,就可以了,呵呵
ambit_tsai-微信 2018-06-20
  • 打赏
  • 举报
回复
引用 3 楼 jeujeujeu的回复:
告诉我吧,着急
建议先去了解下正则表达式,这么多个,让人一下子就不想解释了
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
文盲老顾写得好详细啊,我这个刚刚接触正则表达式的小白,都可以看懂。虽然有的地方还需要消化理解一下。
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
告诉我吧,着急
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
你说得没错,我是在php环境下
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
感谢文盲老顾,非常有耐心和爱心,如果方面的话,后面几个可以说明一下吗?
丰云 2018-06-20
  • 打赏
  • 举报
回复
问错地方了,大家都别告诉他。。。。
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
顶顶更健康!
文盲老顾 2018-06-20
  • 打赏
  • 举报
回复
因为出现了s修饰,推测楼主的正则全部是php环境下的正则,如果没记错php正则默认为非贪婪默示

第一个/<ul class=\"$class\">(.*?)<\/ul>/is
以贪婪模式匹配ul标签及之间的内容,且将ul标签内的内容作为分组1,匹配时忽略大小写,包括换行符也匹配

第二个/<div class=\"$class\".*?>.*?<\/div>/ism
以贪婪默示匹配ul标签及之间的内容,匹配时忽略大小写,每行字符串都单独匹配,修饰符s无效

第三个/<a href=\"(.*?)\".*?>(.*?)<\/a>/i
匹配标签a的内容,其中href的值作为分组1,标签间的文字和其他标签作为分组2,匹配时忽略大小写

第四个/<img.+src=\"?(.+\.(jpg|gif|bmp|bnp|png))\"?.+>/i
匹配<img后第一个src之后,且该src后跟随符合指定扩展名格式的文件名内容的,且文件名后具有任意一个字符以上和右尖括号的内容,其中src后的内容直到最后一个符合匹配条件的扩展名结束位置作为分组1,扩展名作为分组2,匹配时忽略大小写,由于长度修饰符后没有跟随?,所以匹配是以非贪婪模式进行

第五个/<img.*title\=[\"|\'](.*)[\"|\'].*>/i
第六个/<\s*img\s+[^>]*?'.$attr.'\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i
第七个/<span>(.*?)<\/span>/i
第八个 class=\"$class\">(.*?)<\/span>/i
文盲老顾 2018-06-20
  • 打赏
  • 举报
回复
/与/之间为正则表达式,表达式后面跟随的字母为正则定义的方式
js正则修饰符
ignoreCase 返回布尔值,表示RegExp 对象是否具有标志 i
global 返回布尔值,表示RegExp对象是否具有标志g
multiline 返回布尔值,表示RegExp 对象是否具有标志 m。
lastIndex 一个整数,标识开始下一次匹配的字符位置
source 返回正则表达式的源文本(不包括反斜杠)
关于第一个正则的修饰s我还真不知道是什么
php正则修饰符
◆i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。
◆m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。
◆s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
◆x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
◆e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
◆A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
◆E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
◆U:和问号的作用差不多,用于设置"贪婪模式"。
ambit_tsai-微信 2018-06-20
  • 打赏
  • 举报
回复
引用 10 楼 jeujeujeu 的回复:
亲们太给力了,谢谢啊!特别是ambit_tsai很热心,第一个您解释了,我已经懂了。非常感谢你啊!能否解析一下:第二个,第三个,第六个,具体是什么意思呢?先谢谢

i 区分大小写
s 单行模式匹配
M 多行模式匹配
第二个,/<div class=\"$class\".*?>.*?<\/div>/
可以匹配<div class="$class\" id="xxx" style="xxx">xxx</div>
如前面说的,.*?可以匹配任意,所以 id="xxx" style="xxx"都会被匹配到。
同样的,第三个/<a href=\"(.*?)\".*?>(.*?)<\/a>/,匹配href为任意值
其它的都类似
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
亲们太给力了,谢谢啊!特别是ambit_tsai很热心,第一个您解释了,我已经懂了。非常感谢你啊!能否解析一下:第二个,第三个,第六个,具体是什么意思呢?先谢谢
ambit_tsai-微信 2018-06-20
  • 打赏
  • 举报
回复
我才你还想问什么非贪婪式。 如<ul class=\"$class\">(.*?)<\/ul> 因为.*,是可以匹配任意内容,所以其后的所有内容都会被它匹配,称为贪婪式。 但我们不想<\/ul>被它匹配掉,所以加个?变成非贪婪式,这样匹配过程会尝试匹配.*?后面的表达式,一旦匹配成功,.*?的匹配就结束了。
天际的海浪 2018-06-20
  • 打赏
  • 举报
回复
对照这个表。你自己就能解读 \ 匹配将依照下列规则: 在非特殊字符之前的反斜杠表示下一个字符是特殊的,不能从字面上解释。例如,没有前面'\'的'b'通常匹配小写'b',无论它们出现在哪里。如果加了'\',这个字符变成了一个特殊意义的字符,意思是匹配一个字符边界。 反斜杠也可以将其后的特殊字符,转义为字面量。例如,模式 /a*/ 代表会匹配 0 个或者多个 a。相反,模式 /a\*/ 将 '*' 的特殊性移除,从而可以匹配像 "a*" 这样的字符串。 使用 new RegExp("pattern") 的时候不要忘记将 \ 进行转义,因为 \ 在字符串里面也是一个转义字符。 ^ 匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。 例如,/^A/ 并不会匹配 "an A" 中的 'A',但是会匹配 "An E" 中的 'A'。 当 '^' 作为第一个字符出现在一个字符集合模式时,它将会有不同的含义。补充字符集合 一节有详细介绍和示例。 $ 匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。 例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。 * 匹配前一个表达式0次或多次。等价于 {0,}。 例如,/bo*/会匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b',但是在 "A goat grunted" 中将不会匹配任何东西。 + 匹配前面一个表达式1次或者多次。等价于 {1,}。 例如,/a+/匹配了在 "candy" 中的 'a',和在 "caaaaaaandy" 中所有的 'a'。 ? 匹配前面一个表达式0次或者1次。等价于 {0,1}。 例如,/e?le?/ 匹配 "angel" 中的 'el',和 "angle" 中的 'le' 以及"oslo' 中的'l'。 如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。 例如,对 "123abc" 应用 /\d+/ 将会返回 "123",如果使用 /\d+?/,那么就只会匹配到 "1"。 还可以运用于先行断言,如本表的 x(?=y) 和 x(?!y) 条目中所述。 . (小数点)匹配除换行符之外的任何单个字符。 例如,/.n/将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。 (x) 匹配 'x' 并且记住匹配项,就像下面的例子展示的那样。括号被称为 捕获括号。 模式/(foo) (bar) \1 \2/中的 '(foo)' 和 '(bar)' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。模式中的 \1 和 \2 匹配字符串的后两个单词。注意 \1、\2、\n 是用在正则表达式的匹配环节。在正则表达式的替换环节,则要使用像 $1、$2、$n 这样的语法,例如,'bar foo'.replace( /(...) (...)/, '$2 $1' )。 (?:x) 匹配 'x' 但是不记住匹配项。这种叫作非捕获括号,使得你能够定义为与正则表达式运算符一起使用的子表达式。来看示例表达式 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2}将只对 ‘foo’ 的最后一个字符 ’o‘ 生效。如果使用非捕获括号,则{1,2}会匹配整个 ‘foo’ 单词。 x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找。 例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。 x(?!y) 匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。 例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’但是不是‘3.141’ x|y 匹配‘x’或者‘y’。 例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’ {n} n是一个正整数,匹配了前面一个字符刚好发生了n次。 比如,/a{2}/不会匹配“candy”中的'a',但是会匹配“caandy”中所有的a,以及“caaandy”中的前两个'a'。 {n,m} n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。 例如,/a{1, 3}/ 并不匹配“cndy”中的任意字符,匹配“candy”中的a,匹配“caandy”中的前两个a,也匹配“caaaaaaandy”中的前三个a。注意,当匹配”caaaaaaandy“时,匹配的值是“aaa”,即使原始的字符串中有更多的a。 [xyz] 一个字符集合。匹配方括号的中任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。 例如,[abcd] 和[a-d]是一样的。他们都匹配"brisket"中得‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/都匹配“test.i.ng”中的所有字符。 [^xyz] 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。 例如,[^abc] 和 [^a-c] 是一样的。他们匹配"brisket"中的‘r’,也匹配“chop”中的‘h’。 [\b] 匹配一个退格(U+0008)。(不要和\b混淆了。) \b 匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者没有其他“字”字符在其前面的位置。注意,一个匹配的词的边界并不包含在匹配的内容中。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了) 例子: /\bm/匹配“moon”中得‘m’; /oo\b/并不匹配"moon"中得'oo',因为'oo'被一个“字”字符'n'紧跟着。 /oon\b/匹配"moon"中得'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。 /\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。 注意: JavaScript的正则表达式引擎将特定的字符集定义为“字”字符。不在该集合中的任何字符都被认为是一个断词。这组字符相当有限:它只包括大写和小写的罗马字母,十进制数字和下划线字符。不幸的是,重要的字符,例如“é”或“ü”,被视为断词。 \B 匹配一个非单词边界。他匹配一个前后字符都是相同类型的位置:都是“字”字符或者都不是“字”字符。一个字符串的开始和结尾都被认为不是“字”字符,或者空字符串。 例如,/\B../匹配"noonday"中的'oo', 而/y\B./匹配"possibly yesterday"中的’ye‘ \cX 当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。 例如,/\cM/ 匹配字符串中的 control-M (U+000D)。 \d 匹配一个数字。 等价于[0-9]。 例如, /\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。 \D 匹配一个非数字字符。 等价于[^0-9]。 例如, /\D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的'B' 。 \f 匹配一个换页符 (U+000C)。 \n 匹配一个换行符 (U+000A)。 \r 匹配一个回车符 (U+000D)。 \s 匹配一个空白字符,包括空格、制表符、换页符和换行符。 等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。 例如, /\s\w*/ 匹配"foo bar."中的' bar'。 \S 匹配一个非空白字符。 等价于[^ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。 例如, /\S\w*/ 匹配"foo bar."中的'foo'。 \t 匹配一个水平制表符 (U+0009)。 \v 匹配一个垂直制表符 (U+000B)。 \w 匹配一个单字字符(字母、数字或者下划线)。 等价于[A-Za-z0-9_]。 例如, /\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。 \W 匹配一个非单字字符。 等价于[^A-Za-z0-9_]。 例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'。 \n 在正则表达式中,它返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。 比如 /apple(,)\sorange\1/ 匹配"apple, orange, cherry, peach."中的'apple, orange,' 。 \0 匹配 NULL (U+0000) 字符, 不要在这后面跟其它小数,因为 \0<digits> 是一个八进制转义序列。 \xhh 与代码 hh 匹配字符(两个十六进制数字) \uhhhh 与代码 hhhh 匹配字符(四个十六进制数字)。
ambit_tsai-微信 2018-06-20
  • 打赏
  • 举报
回复
. 表示匹配除换行符 \n 之外的任何单字符。 * 表示匹配前面的子表达式零次或多次。 ? 表示匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 () 表示标记一个子表达式的开始和结束位置。 所以(.*?)表示非贪婪式的匹配任意值。
jeujeujeu 2018-06-20
  • 打赏
  • 举报
回复
主要是这几个表达式中(第一个,第三个,第五个,第六个,第七个,第八个)的 (.*?) 分别代表什么意思?

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧