php正規表示式,關於php正規表示式的問題
正規表示式確是乙個很強大的東東,值的學習學習,以下是關於php正規表示式的高階部分。(什麼是正規表示式,php正規表示式)(
因第一次投稿,如有錯誤,請多多包涵。
說起正規表示式
,可以一直上溯至對人類神經系統如何工作
的早期研究。warren mcculloch和walter pitts這兩位神經生理學家研究出一種數學方式來描述這些神經網路。
2023年,一位叫stephen kleene的美國數學家在mcculloch和pitts早期工作的基礎上,發表了一篇標題為「神經網事件的表示法」的**,引入了正規表示式的概念。正規表示式就是用來描述他稱為「正則集的代數」的表示式,因此採用「正規表示式」這個術語。
隨後,發現可以將這一工作應用於使用ken thompson的計算搜尋演算法的一些早期研究,ken thompson是unix的主要發明人。正規表示式的第乙個實用應用程式就是unix中的qed編輯器。
這個專題
主要是為了提高大家對正規表示式的認識和高階
的使用。
1 使用正規表示式來檢測html
是否關閉
function check_html($html)
return true;
}
解釋:
/<([a-za-z0-9]+)//s*[^///>]*>/這個模式是用來匹配html的標記(如:,
等)的。並且在$end_tags中保持這閉合的標籤名。然後我們用count($start_tags[1]) != count($end_tags[1])這個條件語句來判斷開始的標記跟閉合的標記是否相等,不相等就說明沒閉合。最後用in_array($start_tags[1][$i], $end_tags[1])來判斷開始標跟閉合的標記是否相等。至此,我們就完成了html的匹配了!
2 匹配e-mail格式
function check_email($email) ~]+(/.[/w/d!#$%&'*+-//=?^`~]+)*@([a-z/d][-a-z/d]*[a-z/d]/.)+[a-z][-a-z/d]*[a-z]$/", $eamil)) return true;
return false;
}
解釋:
不要被/^[/w/d!#$%&'*+-//=?^`~]+(/.[/w/d!#$%&'*+-//=?^`~]+)*@([a-z/d][-a-z/d]*[a-z/d]/.)+[a-z][-a-z/d]*[a-z]$/這條模式給嚇跑了,其實也很簡單的。前部分[/w/d!#$%&'*+-//=?^`~]+(/.[/w/d!#$%&'*+-//=?^`~]+)*只是匹配符合rfc-2882標準的e-mail位址允許出現的字元,就是英文本母,數字跟一些符號,有興趣可以查詢rfc-2882手冊,而([a-z/d][-a-z/d]*[a-z/d]/.)+就是匹配host的。最後[a-z][-a-z/d]*[a-z]就是匹配頂級網域名稱的(如:.com、.org)。
3 非貪心模式
有時候使用正規表示式的時候,你會發現有以下的問題:
preg_match('/".*"/', 'tony say:"hello", jack say: "hi"', $matches);
print_r($matches);
很驚奇的你會發現匹配的是這樣的內容"hello", jack say: "hi",而不是"hello"和"hi"。這就是貪心匹配引起的。在貪心匹配中,正規表示式會盡可能的匹配最多的字元,所以出現了第一種情況,但是我們想要的是第二種情況,那我們要怎麼做呢?
我們可以使用非貪心匹配,將剛才的模式改為/".*?"/這樣就可以看見我們想要的結果了。*?這個就是非貪心匹配模式。還有另外一種就是+?。
? *?:前面的字元可以出現任意多次,但是遇到*?後的乙個字元即停止匹配。
? +?:前面的字元可以出現一次或者多次,但是遇到+?後的乙個字元即停止匹配。
4 檢測乙個使用者密碼是否安全
function is_good_pw($pw) /', $pw))
return false;
}
解釋:
在本例中,我們使用了/(?=.*[0-9])(?=.*[a-z])(?=.*[a-z])./模式來匹配我們的密碼。在這個模式中,我們使用了正規表示式中的前瞻模式(?=)。(?=.*[0-9])這個是匹配密碼中有數字,而(?=.*[a-z])是匹配密碼中有小寫字母,最後(?=.*[a-z])就是匹配密碼中有大寫字母。而.這個就是匹配密碼是由8至16個字元組成的。那麼我們的密碼就需要有數字,大寫字母和小寫字母組成的就屬於安全的密碼了~
5 匹配乙個**
中的所有鏈結
function get_links($link)
在這個例子中,我們想用file_get_contents來取得乙個網頁的內容。然後用str_replace("/n", "", $html)把所有的換行去掉。再用preg_replace('//', "/n", $html)來把所有的.....模式另起一行。最後就用preg_match_all('/.*?/', $html, $matches)匹配鏈結模式。/.*?/就是匹配.....這種模式的正規表示式。那我們為什麼要把.....鏈結另起一行呢??因為在/.*?/模式中,.*是不能匹配換行的,所以就如和不在同一行就不能匹配了!!所以我們要這樣做!
php正規表示式詳解,PHP正規表示式使用詳解
操作符 描述 轉義符 圓括號和方括號 限定符 anymetacharacter 位置和順序 或 操作 全部符號解釋 字元 描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開...
PHP正規表示式
php正規表示式的定義 用於描述字元排列和匹配模式的一種語法規則。它主要用於字串的模式分割 匹配 查詢及替換操作。php中的正則函式 php中有兩套正則函式,兩者功能差不多,分別為 一套是由pcre perl compatible regular expression 庫提供的。使用 preg 為字...
PHP正規表示式
今天起,會開始弄乙個php教程系列文章.主要是針對正規表示式的.大概的內容排序是這樣安排的 1.php 中的正規表示式 2.八個實用的php正規表示式 3.如何書寫更易閱讀的php正規表示式 4.半小時精通正規表示式 5.正則在文章採集系統中的應用及常見問題答疑 6.更多策劃中 投稿,完善本系列,讓...