正则表达式教程 正则表达式 正则 教程 PHP 技术 正则表达式教程三 —— 元字符 2017-12-20 17:11 2086 更新于 2017-12-20 17:11 快年底了,事儿比较多,自己又在玩 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 ```php $s = <<<'TEXT' 第一行 第二行 第三行 TEXT; echo preg_replace('#\r\n|\n#','|enter|',$s); //第一行|enter|第二行|enter|第三行 ``` 将换行符替换为 |enter|,在php 中有个内置常量,可以自动识别用哪一种换行模式——PHP_EOL ```php 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 ```php $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八 ) ) ```