熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP正則表達式使用的方法

2013-11-15 12:23:16  來源: PHP編程 

  PHP正則表達式主要用於字符串的模式分割匹配查找及替換操作使用正則表達式在某些簡單的環境下可能效率不高因此如何更好的使用PHP正則表達式需要綜合考慮

我的PHP正則入門是起源於網上的一篇文章這篇文章由淺入深的闡述了PHP正則表達式使用的方法我覺得是一個很好的入門材料不過學成還是要 靠個人在使用的過程中還是會不斷地忘記因此反反復復的閱讀了這篇文章有四五遍對於其中一些比較困難的知識點甚至要用很久才能消化但是只要能見 堅持著看完你會發現自己對於正則的運用能力就會顯著提高

PHP正則表達式的定義

用於描述字符排列和匹配模式的一種語法規則它主要用於字符串的模式分割匹配查找及替換操作

PHP中的正則函數

PHP中有兩套正則函數兩者功能差不多分別為

一套是由PCRE(Perl Compatible Regular Expression)庫提供的使用“preg_”為前綴命名的函數

一套由POSIX(Portable Operating System Interface of Unix )擴展提供的使用以“ereg_”為前綴命名的函數(POSIX的正則函數庫自PHP 以後就不在推薦使用從PHP以後就將被移除)

由於POSIX正則即將推出歷史舞台並且PCRE和perl的形式差不多更利於我們在perl和php之間切換所以這裡重點介紹PCRE正則的使用

PCRE正則表達式

PCRE全稱為Perl Compatible Regular Expression意思是Perl兼容正則表達式

在PCRE中通常將模式表達式(即正則表達式)包含在兩個反斜線“/”之間如“/apple/”

正則中重要的幾個概念有元字符轉義模式單元(重復)反義引用和斷言這些概念都可以在文章[]中輕松的理解和掌握

常用的元字符(Metacharacter)

元字符     說明

A       匹配字符串串首的原子

Z       匹配字符串串尾的原子

b       匹配單詞的邊界     /bis/   匹配頭為is的字符串   /isb/   匹配尾為is的字符串   /bisb/ 定界

B       匹配除單詞邊界之外的任意字符   /Bis/   匹配單詞“This”中的“is”

d     匹配一個數字等價於[]

D     匹配除數字以外任何一個字符等價於[^]

w     匹配一個英文字母數字或下劃線等價於[azAZ_]

W     匹配除英文字母數字和下劃線以外任何一個字符等價於[^azAZ_]

s     匹配一個空白字符等價於[ftv]

S     匹配除空白字符以外任何一個字符等價於[^ftv]

f     匹配一個換頁符等價於 xc 或 cL

匹配一個換行符等價於 xa 或 cJ

匹配一個回車符等價於xd 或 cM

t     匹配一個制表符等價於 x或cl

v     匹配一個垂直制表符等價於xb或ck

oNN   匹配一個八進制數字

xNN   匹配一個十六進制數字

cC    匹配一個控制字符

模式修正符(Pattern Modifiers)

模式修正符在忽略大小寫匹配多行中使用特別多掌握了這一個修正符往往能解決我們遇到的很多問題

i     -可同時匹配大小寫字母

M     -將字符串視為多行

S     -將字符串視為單行換行符做普通字符看待使“”匹配任何字符

X     -模式中的空白忽略不計  

U     -匹配到最近的字符串

e     -將替換的字符串作為表達使用

格式/apple/i匹配“apple”或“Apple”等忽略大小寫     /i

PCRE的模式單元

// 提取第一位的屬性

/^d{} ([W])d{}d{}$匹配“//  ”等字符串但上述正則表達式不匹配“/”的格式這是因為模式“[W]”的結果“/”已經被存儲下個位置“”引用 時其匹配模式也是字符“/”

當不需要存儲匹配結果時使用非存儲模式單元“(?)”

例如/(?:a|b|c)(D|E|F)g/ 將匹配“aEEg”在一些正則表達式中使用非存儲模式單元是必要的否則需要改變其後引用的順序上例還可以寫成/(a|b|c)(C|E|F)g/

  PCRE正則表達式函數

preg_match()和preg_match_all() 
preg_quote() 
preg_split() 
preg_grep() 
preg_replace() 

函數的具體使用我們可以通過PHP手冊來找到下面分享一些平時積累的正則表達式

匹配action屬性

$str = ’’; 
$match = ’’; 
preg_match_all(’/s+action="(?!http:)(*?)"s/’ $str $match); 
print_r($match);  


在正則中使用回調函數

/** 
* replace some string by callback function 

*/ 
function callback_replace() { 
$url = ’
$str = ’’; 
$str = preg_replace ( ’/(?<=saction=")(?!http:)(*?)(?="s)/e’ ’search($url )’ $str ); 

echo $str; 


function search($url $match){ 
return $url  ’/’  $match; 


帶斷言的正則匹配

$match = ’’; 
$str = ’xxxxxxcomcn bold font 
paragraph text 

’; 
preg_match_all ( ’/(?<=<(w{})>)*(?=</>)/’ $str $match ); 
echo "匹配沒有屬性的HTML標簽中的內容"; 
print_r ( $match );  

替換HTML源碼中的地址

$form_html = preg_replace ( ’/(?<=saction="|ssrc="|shref=")(?!http:|javascript)(*?)(?="s)/e’ ’add_url($url ’’)’ $form_html );  

最後正則工具雖然強大但是從效率和編寫時間上來講有的時候可能沒有explode來的更直接對於一些緊急或者要求不高的任務簡單粗暴的方法也許更好

而對於preg和ereg兩個系列之間的執行效率曾看到文章說preg要更快一點具體由於使用ereg的時候並不多而且也要推出歷史舞台了再加個個人更偏好於PCRE的方式


From:http://tw.wingwit.com/Article/program/PHP/201311/20854.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.