Regular Expression 是一种文字的搜寻语法,可以用很简短的语法,去搜寻文章内容的相关资料,例如我要搜寻 <div class="xx">开头的 html 内容,就可以使用简短的 Regular Expression 来实现,简易的 Reg 使用方式,在之前我写的 JS 表示法就已经介绍过了,Javascript Rrgular Expression,基本上 php 与 JS 的使用方式是大同小异,这里要介绍一些特殊的 PHP Regular Expression 使用方式。
preg_match
preg_match 的功能很像 Javascript 的 match,不同於 Javascript 是直接回传结果, PHP preg_match 的回传值是 true or false ,而比对的结果是存在第三个参数,所以要记得传入第三个参数。
- 第一个参数是 「表示法的规则」
- 第二个参数是比对的文字内容
- 第三个参数是比对结果
下面的范例,是比对一个简单的英文单字,比对成功后,字串会存入 $result
- $text="php Regular express";
- $RegExp='/express/';
- $k=preg_match($RegExp,$text,$result);
- print_r($result); // output Array ( [0] => express )
下面的范例,则是将「部分比对成功」的字串存进 array,我们在 [a-z]+的两边加上括号 「(」「)」,这样就代表这个字串要独立存进array中,执行结果,array[0]存的是总比对成功的字串,而 array[1] 就是存入我们自已指定要撷取的字串了。
- $text="php Regular express";
- $RegExp='/php\s([a-z]+)/i';
- $k=preg_match($RegExp,$text,$result);
- print_r($result);
- //output Array ( [0] => php Regular [1] => Regular )
preg_match_all
preg_match_all 代表全文比对,类同 Javascript的 「g」:global search ,可以一次将所有比对成功的字串存到 array 。
- $text="a:get b:Regular c:express";
- $RegExp='/([a-z]):([a-z]+)/i';
- $k=preg_match_all($RegExp,$text,$result);
- print_r($result[1]);
- //印出第一组比对成功的字串
- //output Array ( [0] => a [1] => b [2] => c )
- print_r($result[2]);
- //印出第二组比对成功的字串
- //output Array ( [0] => get [1] => Regular [2] => express )
preg_split
切割字串,依表示法的规则,将字串切割成 array。
- $text="a:get b:Regular c:express";
- $RegExp='/\s/i';
- $result=preg_split($RegExp,$text);
- print_r($result);
- //Array ( [0] => a:get [1] => b:Regular [2] => c:express )
特殊用法
多行,空行比对
一般在比对字串的时候,如果碰到空行,就比对失败,这时可以使用 「/pattern/s」,代表比对多行文字。
- $text="Regular
- php";
- $RegExp='/.+/';
- preg_match($RegExp,$text,$result);
- print_r($result);
- //只比对到 Regular 就等了,output Array ( [0] => Regular )
- $RegExp='/.+/s';
- preg_match($RegExp,$text,$result);
- print_r($result);
- //加了 s ,成功比对正确的文字,Array ( [0] => Regular php )
- $RegExp='/(.+|\n|\r)+/';
- preg_match($RegExp,$text,$result);
- print_r($result);
- //或是使用 「|」 ,用 or 的方式也可以取得正确的字串。
Email 信箱比对
- $text="test@mail.com.tw";
- $RegExp='/^[\_a-z\d]+(\.[\_a-z\d]+)*@([\da-z](-[\da-z])?)+(\.[a-z]+)+$/i';
- echo preg_match($RegExp,$text);
Url 网址比对
- $text="http://www.domain.com.tw/a.php?search=test1";
- $RegExp='/^(https?:\/\/)?([\da-z\.-]+)(:[0-9]+)?([\/\w\d\-_\.\%]+)([\w\d\.\-_\%\;]+)?(\?[^\?]+)?$/';
- preg_match($RegExp,$text,$result);
- print_r($result);
Script 过泸
- $RegExp='/<[\s]*script[^>]*>.*(<[\s]*\/[\s]*script[\s]*>)?/si';
PHP RegExp 密技
其实 RegExp 是可以断行的,不过很少有人使用这种写法,我觉得这种写法还不错使用,加上注解说明文字之后,未来会比较方便维护,其它同事也容易看得懂。
- <?php
- $RegExp = <<<REG
- {
- http:\/\/ #http://
- ([a-z0-9\.]+) #get domain
- \/
- ([^\?]+) #get path
- }x
- REG;
- $link = "http://www.yahoo.com.tw/path/category/2012/index.php";
- preg_match($RegExp, $link, $REGres);
- print_r($REGres);