快年底了,事儿比较多,自己又在玩 ffmpeg,这个教程三才姗姗来迟
这一节,介绍正则的其它元字符,有些在前面介绍过的,这里就不一一举例了
1、(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
2、(?=pattern)
肯定顺序环视
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
例子 12
$s = <<<'TEXT' windowsXP,windows7,windows10,windows97 TEXT; preg_match_all('#windows(?=(XP|7|10))#',$s,$m); echo "<pre>"; print_r($m[1]); echo "</pre>"; /* Array ( [0] => Array ( [0] => windows [1] => windows [2] => windows ) [1] => Array ( [0] => XP [1] => 7 [2] => 10 ) ) */
记住环视是不会捕获内容的,也就是以 (? 开头的表达式,所以这里为 (XP|7|10) ,这个括号就是为了捕获 xp,7,10
3、(?!pattern)
否定顺序环视
负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
将例子 12 中的表达式改一下
preg_match_all('#windows(?!(XP|7|10))#',$s,$m);
可以匹配 windows97
4、\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
5、\B
和\b 相反,匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
6、\d
常用
匹配一个数字字符。等价于 [0-9]。 字符集在第一节的时候已经讲过
7、\D
匹配一个非数字字符。等价于 [^0-9]。
8、\n
常用
匹配一个换行符,windows下的换行符是 \r\n,linux 下是 \n
例子13
$s = <<<'TEXT' 第一行 第二行 第三行 TEXT; echo preg_replace('#\r\n|\n#','|enter|',$s); //第一行|enter|第二行|enter|第三行
将换行符替换为 |enter|,在php 中有个内置常量,可以自动识别用哪一种换行模式——PHP_EOL
echo preg_replace('#'.PHP_EOL.'#','|enter|',$s);
这样也能达到同样的效果,还方便
9、\r
匹配一个回车符
10、\t
匹配一个制表符
11、\v
匹配一个垂直制表符
12、\f
匹配一个换页符
13、\s
常用
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
14、\S
常用
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
一般使用 [\s\S] 来匹配任何内容(非空白与空白字符都包含了)
例子14
$s = <<<'TEXT' <div>abc一二三.+?#</div> TEXT; preg_match_all('#<div>([\s\S]+)</div>#',$s,$m); echo "<pre>"; print_r($m[1]); echo "</pre>"; /* Array ( [0] => abc一二三.+?# ) */
15、\w
常用
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
16、\W
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
我们也可以用 [\w\W] 来匹配任何内容(非单词与单词字符都包含了),但我一般都使用 [\s\S]
用例子14 试一下吧
布置作业啦
$s = <<<'TEXT' <div>content1 abc一</div><div>content2 5cde八</div><div>content668</div> TEXT;
用 肯定顺序环视 匹配出 "content1 abc一" 和 "content2 5cde八"
得到的结果如下
Array ( [0] => Array ( [0] => <div>content1 abc一</div> [1] => <div>content2 5cde八</div> ) [1] => Array ( [0] => 1 abc一 [1] => 2 5cde八 ) )