php模式匹配
A. php 正則表達式總結
PHP 正則表達式總結
1.PHP中兩個常用的正則函數
a.preg_match 正則函數,以perl語言為基礎
語法:preg_match( mode,string subject,array matches)
說明:mode參數---- 正則的模塊,也就是正則表達式(語法)
subject參數---- 正則的內容
matches參數---- 正則的結果(獲得一個數組的形式)
b.ereg 正則函數,以POSIX基礎(Unix、Script)
語法:ereg(mode ,string subject, array regs)
2.正則表達式中包括的元素
a.原子(普通字元:a-z A-Z 0-9 、原子表、轉義字元)
b.元字元(有特殊功能的字元,如:# 、*)
c.模式修正符(系統內置部分字元 i、m、S、U ...)
3.正則表達式中的「原子」
a.a-z A-Z _ 0-9 //最常見的字元
b.(abc)(skd) //用圓括弧包含起來的單元符號(一個整體)
c.[abcs][^abd] //用方括弧包含的原子表,原子表中的^代表排除或相反的內容
d.轉義字元
d 包含所有的數字[0-9]
D 除所有數字外[^0-9]
w 包含所有英文字元[a-z A-Z 0-9]
W 除所有英文字元外[^a-z A-Z 0-9]
s 回車,換行等
......
註明: 圓括弧 必須是整體才能匹配; 方括弧 只要是其子集,都可以匹配(內容存在)
4.正則表達式元字元
* 匹配前一個內容的0次1次或多次
. 匹配內容的0次1次或多次,但不包含回車換行(代指自己,任何內容)
+ 匹配前一個內容的1次或多次
? 匹配前一個內容的.0次或1次
| 選擇匹配類似PHP中的| (因為這個運算符合是弱類型導致前面最為整體匹配,類似一個單詞匹配)
^ 匹配字元串首部內容
$ 匹配字元串尾部內容
b 匹配單詞邊界,邊界可以是空格或者特殊符合(有單詞分界符,類似空格)
B 匹配除帶單詞邊界意外內容(無單詞分界符)
{m} 匹配前一個內容的重復次數為M次
{m,} 匹配前一個內容的重復次數大於等於M次
{m,n} 匹配前一個內容的重復次數M次到N次
( ) 合並整體匹配,並放入內存,可使用1 2…依次獲取 (調用放入內存中的內容)
5.運算順序
依然遵循從左到→右的運算規則
優先順序:
( ) 圓括弧因為是內存處理所以最高
* ? + { } 重復匹配內容其次
^ $ b 邊界處理第三
| 條件處理第四
最後按照運算順序計算匹配
6.模式修正符
模式修正符是為正則表達式增強和補充的一個功能,使用在正則之外 例如:/ 正則 / U
常用修正符:
i 正則內容在匹配時候不區分大小寫(默認是區分的)
m 在匹配首內容或者尾內容時候採用多行識別匹配
s 將轉義回車取消是為單行匹配如. 匹配的時候
x 忽略正則中的空白
A 強制從頭開始匹配
D 強制$匹配尾部無任何內容 n
U 禁止貪婪匹配 只跟蹤到最近的一個匹配符並結束, 常用在採集程序上的正則表達式
7.匹配功能
preg_match_all 全部匹配函數
語法:preg_match_all ( string pattern, string subject, array matches [, int flags] )
說明:對結果排序使 $matches[0] 為全部模式匹配的數
用途:截取比較詳細的內容,採集網頁,分析文本
8.替換功能
preg_replace 正則替換函數
語法:preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
說明:通過正則表達式來替換相關內容,類似之前學過的str_replace字元串替換,但 功能要強於它
提示:1、替換內容可以是一個正則也可以是數組正則
2、替換內容可以通過修正符e來解決替換執行內容
用途:替換一些比較復雜的內容上,也可以用於內容的轉換上
9.分割功能
preg_split 正則切割
語法:preg_split ( string pattern, string subject [, int limit [, int flags]] )
說明:通過正則表達式來切割相關內容,類似之前學過的explode切割函數,但explode 只能按照一種方式切割有局限性。
;B. php正則表達式 怎樣從後面開始匹配
這頭尾兩個斜杠/是正則表達式的限定符,這是perl正則的標准,而php支持的正則表達式就是perl正則的規范。表示兩個斜杠之間就是正則內容,在結尾斜杠後面可以開啟匹配的模式,例如:/^[\w\x80-\xff]{3,15}$/i
,後面的
i
就是忽略大小寫匹配。
C. php匹配 括弧內的內容
你的已經是寫「對」了的,只不過你沒有提取數字而已。改一下模式:'/\(([\s\s]*?)\)/',這樣就能利用$matchplayers[1]得到你要的數字了。在模式中,括弧有子模式的作用,也就是從左到右,括弧引起的數據從1開始到n,在匹配結果中用下標1到n提取。$matchplayers[0]則是總結果。詳細參考php手冊。
D. php正則匹配多處內容
第一個問題:
preg_match("/<div.*?>((?:(?!<div).)+?)<\/div>/", $content, $match);
echo $match[1];
第二個問題,LZ是不是想匹配出b、c中先出現的一處中的內容?這樣的話:
$content = '
<div class="b">內容</div>
<div class="c">內容</div>';
preg_match("/<div\sclass=\"[bc]\">(.+?)<\/div>/", $content, $match);
echo $match[1];
E. php 正則表達式 url匹配
1,preg_grep(pattern,array);它的返回值是一個新數組,新數組的元素是成功匹配的元素。
F. PHP中使用 preg_match 模糊匹配
preg_match
(PHP 4, PHP 5)
preg_match — Perform a regular expression match
Report a bug
Description
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
Searches subject for a match to the regular expression given in pattern.
Report a bug
Parameters
pattern
The pattern to search for, as a string.
subject
The input string.
matches
If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.
flags
flags can be the following flag:
PREG_OFFSET_CAPTURE
If this flag is passed, for every occurring match the appendant string offset will also be returned. Note that this changes the value of matches into an array where every element is an array consisting of the matched string at offset 0 and its string offset into subject at offset 1.
G. php正則表達式匹配一段中文,中間有換行,空白,應該怎麼寫
有多種處理方法:
1、使用[sS]匹配任意字元,而不是使用「.」
2、使用s單行修飾模式,例:$pattern='#abc.*?def#s';//能匹配abc換行def
3、使用s*匹配換行和空格,php里s能匹配空白字元,含換行
php里的中文使用[x7f-xff]表示,因此,使用正則:
$pattern='#[x7f-xff]+(?:s*[x7f-xff]+)*#';即可
H. 如何使用PHP編程說明
PHP是一門高效的網路編程語言 由於它具有編寫靈活 運行快速等優點 迅速成為Web程序員的首選語言 前不久的一份權威調查表明 現在已經有 %的網站使用PHP作為主要的伺服器端編程語言
但是 要成為一名PHP編程高手卻並不容易 並不像很多人想像的那樣 只要能夠飛快地編寫幾條簡單的代碼去解決一個復雜的問題就是PHP編程高手了 真正的PHP高手還需要考慮更多的其它問題 以下三條准則是一名成熟的PHP程序員在編程中應該首先遵循的准則
懶惰是金
編寫漂亮的代碼
追求程序的速度 而不是編程的速度
一 懶惰是金
做一個懶惰的程序員嗎?這個想法太奇怪了!因為這個世界上最忙碌的人可能就是計算機程序員了 但正是因為程序員太忙了 所以才應該在編程時學會偷懶
對於一個程序員來說 懶惰的方法有兩種 其一 大膽使用現成的別人的程序代碼 把這些代碼融入到你自己的程序或者項目中去 其二是編寫一些有用的代碼建立一個函數庫 在將來編寫程序時可以順手拈來 省去了許多重復的勞動 自然就可以懶惰一點了
這兩種偷懶的方法都非常適合PHP程序員了
首先 PHP是在自由開放的環境中誕生和成長的一門語言 在世界各地 有成千上萬的程序員 他們一直在為PHP的完美而不斷奮斗 他們也願意和別人分享自己的聰明才智和自己編寫的代碼 你每天都可以從一些PHP網站 郵件列表 新聞組發現大量的優秀的程序代碼 這樣說 我培讓並不是鼓勵你整天等著讓別人為你編寫代碼 但是你可以 站在偉人的肩膀上 充分發揚 拿來主義 聰明地應用別人的程序代碼可以節省你大量時間 其次 在PHP中 你可以方便地建立自己的函數庫 這樣可以在你以後編寫程序時省去很多麻煩
下面筆者為大家介紹幾個通用的函數 這些函數有的來自網上的一些開放源代碼的項目 有的精選自郵件列表 如果你能把它們加入到你自己的函數庫中 遲早你將會發現自己受益無窮
通用資料庫處理函數
和其它的CGI函數相比 PHP的優點之一是具有很強大的資料庫處理能力 但是 在PHP中 對於不同的資料庫都使用一些特定的函數來專門處理 缺少通用的資料庫處理函數 這大大降低了程序代碼的可移植性 這也為初學編程的朋友帶來了很多不便
在網上 許多程序員都通過封裝類解決了這個問題 他們編寫了統一的函數用來處理任何流行的資料庫——不管是在Linux世界深受歡迎的mysql_query($Query_String $this->Link_ID);ss_timing_stop();ss_log(INFO ss_timing_current() Secs - $Query_String);$this->Row = ;$this->Errno = mysql_errno();$this->Error = mysql_error();if ($halt_on_error && !$this->Query_ID) {$this->halt( Invalid SQL: $Query_String);}return $this->Query_ID; }
二 編寫漂亮的代碼
將後台程序與前端程序分開
在編寫PHP程序時 有些代碼是用來處理一些事務 例如操作資料庫 進行數學運算等 而另外的一些代碼則只是事務處理的結果顯示出來 例如一些使用echo 語句將結果以HTML的格式顯示在Web瀏覽器上的PHP代碼以及那些直接嵌入PHP程序的HTML代碼 首先我們應該清晰地區分這兩種代碼 把前者稱為後台程序 把後者稱為前端程序
因為PHP是一種嵌入式編程語言 也就是說 所有的PHP代碼都可以嵌入到HTML代碼之中 這為程序的編寫帶來了許多便利之處 但是 物極必反 如果在一段較長的程序中將PHP代碼和HTML代碼混合編寫 這將使程序雜亂無章 不利於程序的維護和閱讀 所以我們需要盡可能地將這些程序中混雜於HTML代碼中的PHP代碼移植出來 在專門的文件中將這些代碼封裝成函數 然後在HTML代碼中使用 include語句來包含這些文件 在適當的位置調用這些函數滑中悶即可
這種做法一方面使HTML代碼和PHP代碼都簡單易讀 另一方面因為HTML代碼需要不斷更新 而這種分離的方法可以確保後台程序不會被破壞 同前端程序不同 後台程序更多追求的是穩定 結構信彎化 極少更改 所以應該認真地設計和管理 其實 在設計台程序時 投入大量時間是值得的 現在栽樹 以後乘涼 在以後的設計工作中將可以輕松地使用現在編寫的後台程序
靈活使用包含文件
正如前面所說的那樣 後台程序應當安排在一系列的包含文件中 包含文件可以通過include語句在需要時動態裝入 也可以在php ini文件中通過使用auto_prepend_file指令預先自動裝入 如果使用後一種方法的話 雖然取得了一勞永逸的好處 但是也有一些缺點值得我們注意 下面的一段代碼向我們展示了解析一個龐大的包含文件需要一定的時間
require(timing inc); ss_timing_start(); include(test inc); ss_timing_stop(); echo ss_timing_current() ?>
在上面的代碼中 test inc是一個 行的包含文件 運行的結果顯示 解析這個包含文件花費了 秒鍾 對於一個大型網站來說 這個速度並不是可以忽略不記的
使用包含文件的另外一個缺點是 如果一個文件中的一個語句發生錯誤 將會使整個網站的PHP程序都無法運行 所以使用起來也及其小心
其實 對包含文件稍做處理 即可以使包含文件只在需要時進行解析 下面的代碼使abc inc文件只在程序需要時才作解析
if ( defined( __LIBA_INC) ) return; define( __LIBA_INC ); /* * 代碼 */ ?>
使用面向對象的編程方法
PHP 也是一種面向對象的語言 面向對象的編程方法是優秀的程序員們非常推崇的一種軟體設計方法 在PHP編程中可以充分發揮面向對象語言的優勢 對編程中的對象進行封裝 在前面的代碼中 我們使用了面向對象的方法 例如在管理資料庫時 我們將query()函數封裝進資料庫類中 這極大地方便了代碼的管理 增加了程序的可讀性
三 追求程序速度 而不是編程的速度
在網站建設中 程序運行速度和網頁下載速度都是關系成敗的重要因素 作為一名Web程序員 應該更加註意代碼的運行速度 下面介紹的幾種方法都在不同程度上提高了代碼的運行速度
使用內嵌的HTML代碼 而不是PHP的echo語句
因為PHP是一門嵌入式Web編程語言 可以將HTML代碼和PHP代碼相互嵌入 但是很多程序員擔心在HTML代碼中過多的使用 嵌入PHP代碼會多次調用PHP解釋器 從而降低了PHP代碼的運行速度 所以寧願使用PHP的echo語句來輸出HTML代碼 而不直接使用HTML代碼 但事實卻恰恰相反 每一個PHP頁面只調用一次PHP解釋器來解釋所有的PHP代碼 所以 只在需要時才嵌入PHP代碼 而大多數的時候直接使用HTML代碼輸入結果 不但不會降低程序的運行速度 而且因為減少了對echo語句的解析 往往可以提高代碼的運行速度
下面的一段代碼證明了我們的結論 在這段代碼中 我們使用了前面介紹的時間測試函數
使用str-replace而不是ereg-replace 習慣使用Perl進行編程的程序員更加願意使用ereg_replace完成字元串替換工作 因為在PHP中ereg_replace的用法和Perl中模式匹配的用法相近 但是 下面的這段代碼證明 使用str_replace 代替 ereg_replace將可以大大提高代碼的運行速度
測試str_replace和ereg_replace的運行速度
//這段代碼測試str_replace的運行速度 emphasis; ?> for ($i= ; $i< ; $i++) {str_replace(i> b> $string) } ?>
//這段代碼測試ereg_replace的運行速度 for ($i= ; $i< ; $i++) {ereg_replace(<([/]*)i> < b> $string) } ?> //列印結果
結論
使用str_replace的時間 - 使用ereg_pattern的時間 -
運行上面的代碼 得到的結果是
使用str_replace的時間 - 使用ereg_pattern的時間 -
從運行的結果我們可以看出使用str_replace替代ereg_replace作為字元串替換函數 極大地提高了代碼的運行速度
注意字元串的引用
PHP 和其它很多編程語言一樣 可以使用雙引號( )來引用字元串 也可以使用單引號() 但是在PHP中 如果使用雙引號來引用字元串 那麼PHP解析器將首先分析字元串中有沒有對變數的引用 有變數的話 將對變數進行替換 如果是單引號 則沒有如此復雜——直接將單引號包含起來的所有字元串直接顯示出來 顯然 在PHP編程中 如果使用單引號引用字元串變數要比使用雙引號快速一些
在資料庫中避免使用聯合操作
比起其它的Web編程語言來說 PHP的資料庫功能十分強大 但是在PHP中資料庫的運行仍然是一件十分費時費力的事情 所以 作為一個Web程序員 要盡量減少資料庫的查詢操作 同時應該為資料庫建立適當的索引 另一件值得注意的事情是在用PHP操作資料庫時 盡可能不使用多個數據表的聯合操作 盡管聯合操作可以增強資料庫的查詢功能 但是卻大大增加了伺服器的負擔
為了說明這個問題 我們可以看看下面的這個簡單的例子
我們在資料庫中創建了兩個數據表foo和big_foo 在數據表foo中 只有一個欄位 包含了從 - 之間的所有自然數 數據表big_foo同樣只有一個欄位 但包含了從 - 之間的全部自然數 所以 從大小上說 big_foo等於foo與它自身進行了聯合操作
$db->query( select * from foo ); secs $db->next_record(); secs $db->query( insert into foo values (NULL) ); secs $db->query( select * from foo as a foo as b ); secs $db->query( select * from foo as a foo as b where a id > b id ); secs $db->query( select * from foo as a foo as b where a id = b id ); secs $db->query( select * from big_foo ); secs
從上面操作結果我們可以發現 對於兩個有 條記錄的數據表進行聯合 其速度並不比對一個 條紀錄的大型數據表單獨進行操作快多少
注意include與require的區別
在PHP變成中 include()與require()的功能相同 但在用法上卻有一些不同 include()是有條件包含函數 而require()則是無條件包含函數 例如在下面的一個例子中 如果變數$somgthing為真 則將包含文件somefile
if($something){include( somefile ); }
但不管$something取何值 下面的代碼將把文件somefile包含進文件里
if($something){require( somefile ); }
下面的這個有趣的例子充分說明了這兩個函數之間的不同
$i = ; while ($i < ) {require( somefile $i );$i++; }
在這段代碼中 每一次循環的時候 程序都將把同一個文件包含進去 很顯然這不是程序員的初衷 從代碼中我們可以看出這段代碼希望在每次循環時 將不同的文件包含進來 如果要完成這個功能 必須求助函數include()
$i = ; while ($i < ) { include( somefile $i ); $i++; }
注意echo和print的區別
PHP中echo和print的功能也基本相同 但是兩者之間也有細微差別 在PHP代碼中可以把print作為一個普通函數來使用 例如執行下面的代碼後變數$res的值將為 $ret = print Hello World ;
lishixin/Article/program/PHP/201405/30767
I. php正則匹配數字
式子:/^[a-zA-Z0-9]+$/u
釋義:
"/":表示正則表達式的定義,固定寫法。
"^":表示開頭。
"[]":表示字元組。匹配所包含的任意一個字元。如,「[ab]」匹配「plain」中的「a」。
"a-z":表示匹配小寫字母a-z的字母範圍。
"A-Z":表示匹配大寫字母A-Z的字母範圍。
"0-9":表示匹配0-9的數字范圍。
"+":表示匹配次數大於等於1。
"$":匹配輸入行尾。如果設置了RegExp對象Multiline屬性,$也匹配「 」或「 」之前的位置。
"u":最後的u是模式修飾符,嚴格的說可能叫預定義常量。表示使用unicode進行匹配。
(9)php模式匹配擴展閱讀:
正則表達式的特點是:
1. 靈活性、邏輯性和功能性非常強;
2. 可以迅速地用極簡單的方式達到字元串的復雜控制。
3. 對於剛接觸的人來說,比較晦澀難懂。
由於正則表達式主要應用對象是文本,因此它在各種文本編輯器場合都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達式來處理文本內容。
J. php 正則表達式 網頁採集為什麼源代碼一換行 模式也換行 就是匹配不到
php里的.不能匹配換行,可以使用[sS]替換.
或者添加s模首喊畢式修飾符,如:
$pattern='#<div>[sS]*?</div>#';
或
$pattern='#<div>.*?</div>#s';
更多正則問題,請參考我的滲枯博客《我眼裡者芹的正則表達式入門教程》