2012
Jan
28

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

Example
  1. $text="php Regular express";
  2. $RegExp='/express/';
  3. $k=preg_match($RegExp,$text,$result);
  4. print_r($result); // output Array ( [0] => express )

下面的范例,则是将「部分比对成功」的字串存进 array,我们在 [a-z]+的两边加上括号 「(」「)」,这样就代表这个字串要独立存进array中,执行结果,array[0]存的是总比对成功的字串,而 array[1] 就是存入我们自已指定要撷取的字串了。

Example
  1. $text="php Regular express";
  2. $RegExp='/php\s([a-z]+)/i';
  3. $k=preg_match($RegExp,$text,$result);
  4. print_r($result);
  5. //output Array ( [0] => php Regular [1] => Regular )

preg_match_all

preg_match_all 代表全文比对,类同 Javascript的 「g」:global search ,可以一次将所有比对成功的字串存到 array 。

Example
  1. $text="a:get b:Regular c:express";
  2. $RegExp='/([a-z]):([a-z]+)/i';
  3. $k=preg_match_all($RegExp,$text,$result);
  4. print_r($result[1]);
  5. //印出第一组比对成功的字串
  6. //output Array ( [0] => a [1] => b [2] => c )
  7. print_r($result[2]);
  8. //印出第二组比对成功的字串
  9. //output Array ( [0] => get [1] => Regular [2] => express )

preg_split

切割字串,依表示法的规则,将字串切割成 array。

Example
  1. $text="a:get b:Regular c:express";
  2. $RegExp='/\s/i';
  3. $result=preg_split($RegExp,$text);
  4. print_r($result);
  5. //Array ( [0] => a:get [1] => b:Regular [2] => c:express )

特殊用法

多行,空行比对

一般在比对字串的时候,如果碰到空行,就比对失败,这时可以使用 「/pattern/s」,代表比对多行文字。

Example
  1. $text="Regular
  2. php";
  3. $RegExp='/.+/';
  4. preg_match($RegExp,$text,$result);
  5. print_r($result);
  6. //只比对到 Regular 就等了,output Array ( [0] => Regular )
  7.  
  8. $RegExp='/.+/s';
  9. preg_match($RegExp,$text,$result);
  10. print_r($result);
  11. //加了 s ,成功比对正确的文字,Array ( [0] => Regular php )
  12.  
  13. $RegExp='/(.+|\n|\r)+/';
  14. preg_match($RegExp,$text,$result);
  15. print_r($result);
  16. //或是使用 「|」 ,用 or 的方式也可以取得正确的字串。

Email 信箱比对

Example
  1. $text="[email protected]";
  2. $RegExp='/^[\_a-z\d]+(\.[\_a-z\d]+)*@([\da-z](-[\da-z])?)+(\.[a-z]+)+$/i';
  3. echo preg_match($RegExp,$text);

Url 网址比对

Example
  1. $text="http://www.domain.com.tw/a.php?search=test1";
  2. $RegExp='/^(https?:\/\/)?([\da-z\.-]+)(:[0-9]+)?([\/\w\d\-_\.\%]+)([\w\d\.\-_\%\;]+)?(\?[^\?]+)?$/';
  3. preg_match($RegExp,$text,$result);
  4. print_r($result);

Script 过泸

Example
  1. $RegExp='/<[\s]*script[^>]*>.*(<[\s]*\/[\s]*script[\s]*>)?/si';

PHP RegExp 密技

其实 RegExp 是可以断行的,不过很少有人使用这种写法,我觉得这种写法还不错使用,加上注解说明文字之后,未来会比较方便维护,其它同事也容易看得懂。

Example
  1. <?php
  2. $RegExp = <<<REG
  3. {
  4. http:\/\/ #http://
  5. ([a-z0-9\.]+) #get domain
  6. \/
  7. ([^\?]+) #get path
  8. }x
  9. REG;
  10.  
  11. $link = "http://www.yahoo.com.tw/path/category/2012/index.php";
  12.  
  13. preg_match($RegExp, $link, $REGres);
  14.  
  15. print_r($REGres);

参考资料


回應 (Leave a comment)