1. 程式人生 > >PHP系統(六)PHP正則表達式

PHP系統(六)PHP正則表達式

php正則

php正則表達式

正則表達式是一種描述字符串結果的語法規則,是一個特定的格式化模式,可以匹配、替換、截取匹配的字符串。常用的語言基本上都有正則表達式,如JavaScriptjava等。其實,只有了解一種語言的正則使用,其他語言的正則使用起來,就相對簡單些。文本主要圍繞解決下面問題展開。

匹配查找分割替換

1、正規表達語法

定界符號:多種都可以%%||、常用//

原子:最少的一個匹配單位位(放在定界符中)、在一個正則表達式中、至少有一個原子

原子是正則表達式的最基本的組成單元、而且在每個模式中最少要包含一個原子、原子是由所有那些未指定為元字符的打印和非打印字符組成、具體分為5類。

1)、普通字符作為原子:如、

a-z A-Z 0-9

2)、一些特殊字符和轉義後元字符作為原子:所有標點符號、但語句特殊意義的符號要轉

義後才可作為原子、如:\”\’\*\+\?\.

3)、一些非打印字符作為原子、如:\f\n\r\t\v\cx

\f 換頁符

\n 換行符

\r回車符

\t制表符

\v垂直制表符

\cx匹配由x指明的控制字符

4)、使用通用字符類型作為原子、如:\d\D\w\W\s\S

\d 代表任意一個數字 [0-9]

\D 代表任意一個非數字 [^0-9]

\w 代表任意一個字 a-z A-Z 0-9 _ [a-zA-Z_]

\W 代表任意一個非字 除了a-z A-Z 0-9 _之外的所有字符[^a-zA-Z_]

\s 代表空白 [\t\n\f\v]

\S 代表非空白 [^\t\n\f\v]

5)、自定義原子表([])作為原子、如:’/[apj]sp/’

[a-zA-Z] -從哪到哪區間範圍 ^除列表中

元字符:不能在正則表達式中單獨使用、修飾原子、是用來擴展原子功能和限定功能(寫在定界符中)

* 用來修飾其前面的原子可以出現01個或多個(任意次) {0,}

+ 用來修飾其前面的原子可以出現1次或多次、不能沒有至少一次{1,}

?用來修飾其前面的原子可以出現0次或1 {0,1}

. 匹配任意單個字符

{m} 用來修飾其前面原子只能出現m

{n,m} 用來修飾其前面原子只能出現nm

{n,} 用來修飾其前面原子最少出現

n

^\A 匹配輸入字符串開始位置

$\Z 匹配輸入字符串結束位置

\b 匹配單詞的邊界

\B 匹配除單詞邊界以外的部分

() 匹配其整體為一個原子、即模式單元、可以理解為多個單元組成的大單元。

改變優先級別

將小原子就成大原子

子模式、整個表達式是一個大的模式、小括號中是每個獨立的子模式反向引用

模式修正符號:修正、對模式(正則)修正(寫在定界符號外面、寫在右邊)

符號:i : 忽略大小寫

m: 視為多行、在使用^$這二個符號時、每一行滿足都可以(默認視為一行處理)

s:修正正則表達式中的 . 可以匹配換行符號、(默認. 不能匹配回車符號)

x:修正正則表達式、可以省略空白

U:取消貪婪模式 等價於(.*?)

正則表達式編補寫

網址正則:

$reg = ‘/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/‘;

http://www.lampbrother.net/php/demo.inc.php?username=admin&p=123456

郵箱正則:

$reg =‘/\w+([+-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i‘;

[email protected]

2(字符串匹配查找)

1)、字符串處理函數

2)、正則表達式函數

註意:如果可以直接使用字符串處理函數處理的字符串、就不要用正則

匹配查找: strops strstr substr(string,start,length)

正則匹配查找preg_match() preg_match_all() preg_grep()

Strpos(string, find,start) 查找字符串在另一字符串中第一次出現的位置、區分大小寫、返回數字(stripos不區分大小寫)

String:必需。規定要搜索的字符串。

Find: 必需。規定要查找的字符串。

Start: 可選。規定在何處開始搜索。

Preg_match(pattern ,string, array)執行一個正則表達式匹配、返回一個數組

Pattern 要搜索的模式,字符串類型、正則。

Subject 輸入字符

Array 返回的數組

$reg=‘/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/‘;

if(preg_match($reg, $_POST[‘url‘], $arr)) {

echo‘<pre>‘;

print_r($arr);

echo‘</pre>‘;

echo"完整的URL {$arr[0]} <br>";

echo"協議是 {$arr[1]} <br>";

echo"主機是 {$arr[2]} <br>";

echo"域名是: {$arr[3]} <br>";

echo"頂層域: {$arr[4]} <br>";

echo"資源參數: {$arr[5]} <br>";

preg_match_all(pattern ,string, array,[flags])執行一個全局正則表達式匹配、返回數組

pattern要搜索的模式,字符串形式。

string輸入字符串。

array多維數組,作為輸出參數輸出所有匹配結果, 數組排序通過flags指定。

flags可以結合下面標記使用(註意不能同時使用PREG_PATTERN_ORDER PREG_SET_ORDER

$p = "我是http://www.qq.com/ss/dad/a.php,

我們不是你的站http://www.bitedy.com/ad/c/dd/admin.php";

if(preg_match_all(‘/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/‘,$p, $arr,PREG_SET_ORDER)) {

echo ‘<pre>‘;

print_r($arr);

echo ‘</pre>‘;

foreach($arr as $ar){

echo "完整的URL {$ar[0]} <br>";

echo "協議是 {$ar[1]} <br>";

echo "主機是 {$ar[2]} <br>";

echo "域名是: {$ar[3]} <br>";

echo "頂層域: {$ar[4]} <br>";

echo "資源參數: {$ar[5]} <br>";

}

}

Preg_grep(paten, array)返回匹配模式的數組條目

pattern要搜索的模式, 字符串形式.

input輸入數組.

flags如果設置為PREG_GREP_INVERT, 這個函數返回輸入數組中與 給定模式pattern不匹配的元素組成的數組.

$arr = array(“aa b”, “cc”, ”a c”, ”dd”);

$content = preg_grep(‘/\s/’, $arr);

Print_r($content);

3、字符串分割

字符串分割:explode() implode()--join()

正則表達式分割:preg_split()

Explode(separator,string,limit)把字符串打散為數組

Separator separator字符做為分隔符

String 要分割的字符串

Limit可選。規定所返回的數組元素的數目。

可能的值:

大於 0 - 返回包含最多 limit 個元素的數組

小於 0 - 返回包含除了最後的 -limit 個元素以外的所有元素的數組

0 - 返回包含一個元素的數組

$str = "L-a-m-p";

print_r(explode("-", $str, 3));

顯示為:Array ( [0] => L [1] => a [2] =>m-p )

preg_split (pattern, string,limit,flags) 通過一個正則表達式分隔字符串、返回數組

pattern用於搜索的模式,字符串形式。

subject輸入字符串

limit如果指定,將限制分隔得到的子串最多只有limit個,返回的最後一個子串將包含所有剩余部分。limit值為-1 0null時都代表"不限制",作為php的標準,你可以使用null跳過對flags的設置。

flags可以是任何下面標記的組合(以位或運算 | 組合)

PREG_SPLIT_NO_EMPTY如果這個標記被設置, preg_split() 將進返回分隔後的非空部分。

PREG_SPLIT_DELIM_CAPTURE果這個標記設置了,用於分隔的模式中的括號表達式將被捕獲並返回。

PREG_SPLIT_OFFSET_CAPTURE如果這個標記被設置, 對於每一個出現的匹配返回時將會附加字符串偏移量. 註意:這將會改變返回數組中的每一個元素, 使其每個元素成為一個由第0 個元素為分隔後的子串,第1個元素為該子串在subject 中的偏移量組成的數組。

Implode(string, array) 將一個一維數組的值轉化為字符串

String string字符連接數組元素

Array 想要轉換的數組

$str = "L-a-m-p";

//print_r(explode("-", $str, 3));

$s=preg_split(‘/\W/‘, $str,-1,PREG_SPLIT_NO_EMPTY);

echo implode("++",$s)."<br>";

list($a,$b)=explode("__","wo__qu");

echo $a."<br>";

echo $b."<br>";

顯示為:L++a++m++p wo qu

4、字符串替換函數

字符串處理:str_replace()

正則表達式:preg_replace()

Str_replace(search,replace, subject, count)查找search替換為replace、字符串替換

Search:查找的目標值,也就是 needle。一個數組可以指定多個目標。

Replacesearch 的替換值。一個數組可以被用來指定多重替換。

Subject:執行替換的數組或者字符串。也就是 haystack

如果 subject 是一個數組,替換操作將遍歷整個 subject,返回值也將是一個數組。

Count:如果被指定,它的值將被設置為替換發生的次數。

$arr = "我是中國人、你是哪國人、中國房產";

$num = 0;

$new = str_replace(array("","中國", "房產"), array("我們","美國","高科技"), $arr, $num);

echo $new;

顯示為:我們是美國人、你是哪國人、美國高科技

Preg_replace(pattern,replacement, subject, limit, count) 查找符合pattern正則替換為replacement、正則字符串替換

Pattern 要搜索的模式、可以是一個正則

Replacement將要替換的字符串或字符串數組

subject替換後的字符串或字符串數組

limit每個模式在每個subject上進行替換的最大次數。默認是 -1(無限)

count如果指定,將會被填充為完成的替換次數

$str = "如晨光http://www.baidu.com特別人的http://www.bitedy.com/ad/index.php";

$url=‘/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/‘;

$new = preg_replace($url, ‘<ahref="\1://\2.\3.\4">\1://$2.$3.$4</a>‘, $str);

echo $str."<br>";

echo $new."<br>";

晃示為:

$str = array(

"如果沒有一些http://www.baidu.com特殊的<b>替換</b>5求(<u>比如正則表達式</u>),你應http://www.lampbrother.net該使用該http://bbs.brophp.org函數替9 <font color=‘red‘>ereg_replace()</font> 9 preg_replace() ",

"如果沒有一些http://www.baidu.com特殊的<b>替換</b>5求(<u>比如正則表達式</u>),你應http://www.lampbrother.net該使用該http://bbs.brophp.org函數替9 <font color=‘red‘>ereg_replace()</font> 9 preg_replace() ",

);

$reg = array(

‘/\<[\/\!]*?[^\<\>]+?\>/is‘,

‘/(https?|ftps?):\/\/(www|mail|bbs|ftp)\.(.*?)\.(net|com|org|cn)([\w-\.\/\=\?\&\%]*)?/e‘,

‘/\d/‘

);

$rep = array(

‘‘,

‘"<ahref=\‘$1://$2.$3.$4\‘>".strtoupper("$1://$2.$3.$4")."</a>"‘,

‘@‘

);

$newstr = preg_replace($reg, $rep,$str);

echo ‘<pre>‘;

print_r($str)."<br>";

print_r($newstr)."<br>";

echo ‘</pre>‘;

preg_quote(string)轉義正則表達式字符、正則表達式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : preg_replace_callback (pattern, callback, subject,[limit[,count]])執行一個正則表達式搜索並且使用一個回調進行替換

pattern要搜索的模式,可以使字符串或一個字符串數組。

Callback 一個回調函數

subject 要搜索替換的目標字符串或字符串數組

limit 對於每個模式用於每個 subject字符串的最大可替換次數。默認是-1(無限制)。

Count 如果指定,這個變量將被填充為替換執行的次數。

$text = "今天是2016-04-05、明年是2017";

$reg ="/(\d{4})-(\d{2}-\d{2})/";

function fun($m){

return ($m[1]+1).$m[2];

}

echopreg_replace_callback($reg, "fun", $text);

顯示為:今天是201704-05、明年是2017


本文出自 “Linux獄長” 博客,請務必保留此出處http://sswqzx.blog.51cto.com/2494644/1966517

PHP系統(六)PHP正則表達式