php正則表達式php
正則表達式是一種描述字符串結果的語法規則,是一個特定的格式化模式,能夠匹配、替換、截取匹配的字符串。經常使用的語言基本上都有正則表達式,如JavaScript、java等。其實,只有瞭解一種語言的正則使用,其餘語言的正則使用起來,就相對簡單些。文本主要圍繞解決下面問題展開。java
匹配查找分割替換正則表達式
1、正規表達語法數組
定界符號:多種均可以%%、||、經常使用//微信
原子:最少的一個匹配單位位(放在定界符中)、在一個正則表達式中、至少有一個原子ide
原子是正則表達式的最基本的組成單元、並且在每一個模式中最少要包含一個原子、原子是由全部那些未指定爲元字符的打印和非打印字符組成、具體分爲5類。函數
(1)、普通字符做爲原子:如、a-z A-Z 0-9等url
(2)、一些特殊字符和轉義後元字符做爲原子:全部標點符號、但語句特殊意義的符號要轉spa
義後纔可做爲原子、如:\」\’\*\+\?\. 等.net
(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] -從哪到哪區間範圍 ^除列表中
元字符:不能在正則表達式中單獨使用、修飾原子、是用來擴展原子功能和限定功能(寫在定界符中)
* 用來修飾其前面的原子能夠出現0個1個或多個(任意次) {0,}
+ 用來修飾其前面的原子能夠出現1次或屢次、不能沒有至少一次{1,}
?用來修飾其前面的原子能夠出現0次或1次 {0,1}
. 匹配任意單個字符
{m} 用來修飾其前面原子只能出現m次
{n,m} 用來修飾其前面原子只能出現n到m次
{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';
mei+zi+zi+zi+zi@lampbrother.net
2、(字符串匹配查找)
(1)、字符串處理函數
(2)、正則表達式函數
注意:若是能夠直接使用字符串處理函數處理的字符串、就不要用正則
匹配查找: strops strstr(string,search) 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, 0或null時都表明"不限制",做爲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。一個數組能夠指定多個目標。
Replace:search 的替換值。一個數組能夠被用來指定多重替換。
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年
微信掃一掃 、關注公衆號
不定時分享資料視頻