PHP 正則
有兩個比較重要的方法 preg_match() 和 preg_replace(); 給一個簡單的例子。要對這個進行匹配,用到的模式如下
$str = "123123,123123,123123,213123,234234";
$model = "/^([0-9]*),(([0-9]*),))*([0-9]*)$/";
$match = array();
$ret = preg_match($model, $str, $match);
$match 中就有匹配到的內容。
貪婪匹配 和 非貪婪匹配 可以參考下面的例子
$eee = "(12)-123 23-(233)";
//貪婪匹配的例子 這個模式只能匹配 一個。
$preg = "/\(.*\)/";
$match = array();
$ans = preg_match_all($preg,$eee,$match);
var_dump($match);
// 結果是隻能匹配一個模式。因爲第一個從整體看來,是一個完整的括號,所以會匹配整個結果。
//非貪婪匹配模式,可以把所有的括號中的內容都找出來,卻別就是*後面的問號。
$preg = "/\(.*?\)/";
$match = array();
$ans = preg_match_all($preg,$eee,$match);
var_dump($match);
正則替換
preg_replace() 可以對 $str 中的內容進行替換。還是上面的例子,這次我們把$eee中國年的括號裏面的數字替換成字符串haha.可以設計出如下的方法。注意 preg_replace 的用法。$pattern 和 $replace 都是array,下面是具體的匹配模式。
按照正則表達式的規則對匹配的內容進行替換。
$eee = "(12)-123 23-(233)";
$preg = array("/\(.*?\)/");
$replace = array("haha");
$ans = preg_replace($preg,$replace,$eee);
var_dump($ans);
上面是比較基本的用法,下面這個稍微複雜一些。
$str = preg_replace("/(<a.*?>)(.*?)(<\/a>)/",'\1<span class="link">\2</span>\3', $str);
// 其中用了三個子模式(每個圓括號中內容爲一個子模式),第一個是鏈接開始標籤,第二個是鏈接文本
// 第三個是</a> 這個正則正則替換的功能是,給所有的鏈接加上<span>標籤,給鏈接的內容加上樣式。
// 通過學習上面的表達是,我們可以將我們前面的例子 轉化成這樣。
$eee = "whie2ch(12)-123 23-function(233)";
$preg ="/(\w*)\(.*?\)/";
$replace ="\1word\2bb"; // 將變量換成word,將括號及括號裏面的內容換成bb \1 \2 代表第幾個括號裏面匹配的內容。
$ans = preg_replace($preg,$replace,$eee);
var_dump($ans);
PHP 修正符
$eee ="whie2ch(1 \n2)-123 n 23-function nhehe(23 \n3) sfsdf(24 \n5)";
$preg ="/\(.*?\)/";
//$replace ="\1word\2bb";
$match = array();
$ans =preg_match_all($preg,$eee,$match);
var_dump($match);
// 這樣,發現是匹配不到括號裏面的內容的。因爲.不包括換行。
// 使用方法,把上面的 $preg 改成下面這樣。
$preg ="/\(.*?\)/s";
重新運行程序,發現所有的內容都匹配出來了。
PHP 的幾個修正符如下
修正符 | 含義 |
---|---|
s | 讓.包括換行,可以實現跨行匹配 |
U | 讓?默認匹配成貪婪狀態 |
i | 忽略大小寫 |
u | 模式串被當做UTF8 |
m | 當 設定了此修正符,行起始(^)和行結束($)除了匹配整個字符串開頭和結束外,還分別匹配其中的換行符(\n)的之後和之前 |
PHP修正符 的使用方式入上面的程序所示。將/your_regrex/X
,其中X代表你的修正符,根據需要選擇。