正規表示式就是用某種模式去匹配一類字串的一種公式。
在php中,正規表示式由三部分組成:分隔符、表示式和修飾符。
preg_match_all('%.*reg$%mi', $str, $arr);
上面是乙個php的正規表示式,引數為:
正規表示式
待匹配字串
匹配到的字串
26個字元可以組成任何單詞。而元字元,可以通過組合去匹配到任何能見到的字串。
元字元描述
.匹配除換行符以外的任意字元
\w匹配字母、數字、下劃線或者漢字
\s匹配任意空白符
\d匹配數字
\b定界符:匹配單詞開始或者結束
^匹配字串開始
$匹配字串結束
-表示範圍
匹配括號中任一字元
*量詞:表示任意多個
+量詞:乙個或者多個
?量詞:乙個或者沒有
{}量詞:在括號範圍之內
\w匹配任意不是字母、數字、下劃線或者漢字的字元
\s匹配非空白的字元
\d匹配非數字
\b匹配非單詞開始或者結束
[aeiou] 匹配括號中的任何乙個字母
c[aou]t 匹配 cat/cot/cut 而不能匹配caout
匹配單個字元
元字元表示特殊的含義,如果想匹配元字元就需要用到轉義。轉義需要在需轉義的字元錢加反斜線(\)。
(.)表示任意字元,而(.)則表示 . 這個字元
(\w)表示word、而(\w)則表示 \w 這個字串
分支就相當於程式設計時遇到了if語句。
[ch]at 可以匹配 cat/hat
(c|h|f|to)at 可以匹配 cat/hat/fat/toat
在匹配時、就相當於遇到了選擇語句,需要判斷之後再匹配
分支檢測為if/else語句,遇到if中條件為真則不會繼續匹配
分組的作用就是將多個字元看做是乙個整體。
.* 表示任意字元重複任意次
(abc)* 表示abc這個字串以相同的順序重複任意多次
類別語法
描述 捕獲
(exp)
匹配exp,並捕獲文字到自動命名的組裡
(?《name》exp)
匹配exp,並給匹配到的文字命名,也可以寫成(?'name'exp)
(?:exp)
匹配exp並且不給此分組分配組號
零寬斷言
(?=exp)
匹配exp前面的位置
(?《=exp)
匹配exp後面的位置(英文小於號無法顯示,用書名號代替)
(?!exp)
匹配後面跟的不是exp的位置
(?《!exp)
匹配前面不是exp的位置(英文小於號無法顯示,用書名號代替)
注釋(?#comment)
提供注釋,不對表示式產生影響
\b(\w+)\b\s+\1\b
這個可以匹配 go go 或者 a a
\1 指的是在前面第乙個捕獲的分組
也可以使用這個 \k< word >
\b(?< word >\w+)\b\s+\k < word > \b
正則匹配有四種環視方式:
四種方式對應的表示式分別為:
乍一看確實很難理解,但是我這裡有更好的理解方式:
理解了以上幾條之後,你就可以開始寫複雜的正規表示式了。
例子:
(?<![a-z])\d 前面不是小寫字母的7位數字
.* 表示貪婪匹配,能匹配更多就匹配多個
.*? 表示懶惰匹配,在能匹配更多個的時候優先不匹配
懶惰限定符
描述*?
重複任意次,但盡可能少重複
+?重複1次或更多次,但盡可能少重複
??重複0次或1次,但盡可能少重複
?重複n到m次,但盡可能少重複
?重複n次以上,但盡可能少重複
一般忽略大小寫時為全域性生效,若想部分生效需要如此:
#ab(?i)c#
此表示式會匹配abc和abc
<?php
// 多行模式的本質是檢查是否有 \n 換行符
$source1 = 'abc\nabcd';
$source2 = "abc\nabcd";
if (preg_match_all('%^abc%m', $source1, $arr)) else
if (preg_match_all('%^abc%m', $source2, $arr)) else
點號通配模式的作用是使正規表示式的點號元字元能匹配換行符,如果沒有這個修飾符,點號不匹配換行符。
// 點號通配模式(s),使點號可以匹配換行符
$str = "
";$arr1 = $arr2 = array();
preg_match_all('%(.*)<\/body>%', $str, $arr1);
var_dump($arr1); // 為空
preg_match_all('%(.*)<\/body>%s', $str, $arr2);
var_dump($arr2); // 匹配成功
加上懶惰模式,相當於在.*後面加上問號。
加上結尾限制,則結尾不能有換行符
啟用u模式,模式字串被當成utf-8。php4.1可用。
// 支援 utf-8 轉義表達 (u)
$str = "php 程式設計";
if (preg_match("/^[\x-\x]+$/u", $str)) else
\w@\w\.\w
1\d
<?php
$str = '[url]1.gif[/url][url]2.gif[/url][url]3.gif[/url]';
$reg = "#\[url\](.*?)\[\/url\]#"; // 此處使用懶惰模式匹配,否則會一直匹配到最後的標籤
$s = preg_replace($reg, "!(", $str);
echo $s;
從大到小
轉義符 \
括號和中括號
量詞限定符 */+/?等
定位點和序列 ^/$/ 元字元、連字元
替換 |
正規表示式 1 正規表示式基礎
1.正規表示式基礎 正規表示式描述了一種字串匹配的模式,即可以使使用者通過一系列普通字元或特殊字元構建能夠明確描述文字字串的匹配模式,可以用來檢查某個字串是否含有某種子字串,將匹配的子字串做替換或者從某個字串中取出符合某個條件的子字串等。1.1 正規表示式的基本結構 乙個正規表示式就是由普通字元 如...
正規表示式基礎
限定符 d 匹配非負整數 正整數 0 0 9 1 9 0 9 匹配正整數 d 0 匹配非正整數 負整數 0 0 9 1 9 0 9 匹配負整數 d 匹配整數 d d 匹配非負浮點數 正浮點數 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 匹配正浮點數 d...
正規表示式基礎
元字元 描述 匹配任何單個字元。例如正規表示式r.t匹配這些字串 rat rut r t,但是不匹配root。匹配行結束符。例如正規表示式weasel 能夠匹配字串 he s a weasel 的末尾,但是不能匹配字串 they are a bunch of weasels.匹配一行的開始。例如正規...