完整的正則表達式由兩種字符組成 特殊字符(元字符)和普通字符(文本)
示例:
/^\d+hello.*/
\d + . * 都是元字符
hello是普通字符php
. 除了換行之外的任意字符
[abcde] 匹配abcde裏面的任意字符
[^abcde] 不匹配abcde裏面的任意字符
[a-h] 匹配a-h的任意字符
\w至關於[a-zA-Z0-9_]
\W至關於[^a-zA-Z0-9_]
\s匹配任何空白字符[ \f\n\r\t\v]
\S匹配任意非空白字符[^\s]
\d匹配數字
\D不匹配數字
[\u4e00-\u9fa5]匹配任意漢字(這裏用unicode編碼表示漢字)正則表達式
*匹配0-多個字符
?匹配0-1個元字符
{0,}0-多個元素
{0,1}0-1個字符
{n}匹配n個字符
{n,}匹配至少N個字符
+至少匹配一個
\b匹配單詞邊界
^匹配行首
$匹配行尾測試
1)特殊字符轉義:\,?,",好比至少一個\,正則表達式匹配應爲\\+
2)能夠將元字符或普通字符括起來做爲分組優化
如何斷定哪些是元字符?
元字符轉義測試編碼
不匹配任何字符,只匹配特定的位置,相似於\b,^,$。環視不會佔用字符
環視分爲順序和逆序兩種
順序(?=exp)位置的後面能匹配exp,(?!exp)位置的後面能不匹配exp
逆序(?<=exp)位置的前面能匹配的exp,例如(?<=\d)當前位置的左邊是數字
(?<!exp)位置的前面不能匹配的exp,例如(?<!\d)當前位置的左邊不能匹配數字spa
<?php $string = 'aaabaab'; $pattern1 = '/a.{1,10}b/'; $pattern2 = '/a.{1,10}?b/'; preg_match_all($pattern1,$string,$arr1); preg_match_all($pattern2,$string,$arr2); var_dump($arr1); var_dump($arr2);
1.正則引擎的瞭解
2.回溯
3.表達式的優化
1)化簡量詞
2)儘可能不使用分組
3)儘可能不使用或a|b|c不如[abc]的效率
4)回溯的越少,速度越快code
1)i 大小寫不敏感
2)m 加強的行錨點模式
3)x 空白和#註釋將被忽略
4)s 點號元字符匹配全部字符,包含換行符
5)e 將替換後的字符串做爲PHP 代碼評估執行blog
PHP中的pcre庫和posix庫的對比
pcre的正則分隔符能夠是任意的unicode