PHP正規表示式,關於PHP正規表示式的問題

2021-05-25 18:11:29 字數 3237 閱讀 7395

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.更多策劃中 投稿,完善本系列,讓...