正则环视 php,正则表达式基本知识(php)
這里的知識點基本上是《正則指引》的讀書筆記,只是每個知識點的示例代碼用php來實現。
1. 字符組
字符組(Character Class)就是一組字符,在正則表達式中,它表示“在同一個位置可能出現的各種字符”。
寫法:[ab]、[314]、[#.?]
字符組的基本用法
[...]
preg_match('/[0123456]/', '5'); // => 1
preg_match('/[abc123]/', '5'); // => 0
范圍表示法(range)
[x-y]表示x到y整個范圍內的字符。如,[0123456789]表示為[0-9],[abcdefghijk]表示為[a-k]。
為什么是[0-9],而不是[9-0]?
因為-表示的范圍一般是根據字符對應的碼值(Code Point)來確定的。典型地有ACSⅡ編碼。在ACSⅡ編碼中,0~9的碼值是48~57,a~z的碼值是97~122,A~Z的碼值是65~90。
preg_match('/[0-9]/', '5'); // => 1
preg_match('/[a-z]/', '5'); // => 0
preg_match('/[0-9a-fA-F]/', '0'); // 16進制
字符組簡記法(shorthands)
提供比范圍表示法更簡潔的表示方法,如\d表示[0-9],\w表示[0-9a-zA-z_]。
php中支持的字符組簡記:
\d 所有的數字,即[0-9]
\D 所有的非數字,與\d互斥
\w 所有的單詞字符(字符、數字、下劃線),即[0-9a-zA-Z_]
\W 所有的非單詞字符,與\W互斥
\s 所有的空白字符,包括空格、制表符、回車符、換行符等空白字符
\S 所有的非空白字符,與\s互斥
preg_match('/\d/', '8'); // => 1
preg_match('/\d/', 'a'); // => 0
preg_match('/\d[a-z]/', 'a'); // => 1
preg_match('/\w/', 'a'); // => 1
preg_match('/\w/', '6'); // => 1
preg_match('/\w/', '_'); // => 1
preg_match('/\s/', ' '); // => 1
preg_match('/\s/', "\t"); // => 1
preg_match('/\s/', "\r"); // => 1
元字符與轉義
在范圍表示法中,字符組中的橫線-不能匹配橫線字符,而是用來表示范圍,這類字符叫做元字符(meta-character)。元字符除了-還有開方括號[、閉剛括號]、^、$等,它們都有特殊的意義。
當元字符想要表示普通字符的含義時(如-就只想表示橫線字符),就需要轉義處理(在元字符前加反斜線字符\)。對于-,有一個例外情況,就是當它緊跟著字符組中的開括號[時,它就表示普通橫線字符,此時不用轉義。
preg_match('/[0\-9]/', "-"); // => 1
preg_match('/[0\-9]/', "8"); // => 0
preg_match('/[0\-9]/', "0"); // => 1
preg_match('/[-09]/', "-"); // => 1
preg_match("/[0\\-9]/", "-"); // => 1
preg_match("/[0\-9]/", "-"); // => 1
仔細看上面第一個表達式和最后兩個表示式。這里要注意:
在php中,字符串既可以用單引號標注也可以用雙引號標注。兩者的主要區別在于,雙引號字符串可以插值,二單引號字符串不能;另外,雙引號字符串會處理字符串轉義,二單引號字符串不會
正則表達式是以字符串的方式提供的。在php中,雙引號字符串本身也有關于轉義的規定(如"\\"、'\r'、"\t"等),因此"0\\-9"與'0\-9'是等價的。
那么最后一個表達式為什么也可以匹配呢?這是因為,盡管php的正則表達式用字符串文字給出,但它與常見的字符串不完全一樣——如果某個轉義序列可以有字符串識別,則對其進行轉義處理;否則,將整個轉義序列“原封不動”地保存下來。
因此,在正則表達式中轉義要小心,在php中,使用單引號字符串來構建正則表達式會比雙引號字符串更簡單明了。
排除型字符組(Negated Character Class)
在方括號[…]中列出希望匹配的所有字符叫做“普通字符組”。在開方括號[之后緊跟一個脫字符^,寫作[^…],表示“在當前位置,匹配一個沒有列出的字符”。例如,[^0-9]匹配非數字字符。
preg_match('/[^0-9][0-9]/', "A8"); // => 1
排除型字符組中的緊跟著開方括號[的脫字符^也是元字符,如果要匹配尖括號字符,需要進行轉義處理。但是,不緊跟著開方括號[的^就是普通字符,不需要轉義。
preg_match('/[^0-9]/', '0'); // => 0
preg_match('/[\^0-9]/', '0'); // => 1
preg_match('/[\^0-9]/', '^'); // => 1
preg_match('/[0-9^]/', '^'); // => 1
POSIX字符組
之前介紹的字符組,都屬于Perl衍生出來的正則表達式流派(Flavor),這個流派叫做PCRE(Per Compatible Regular Expression)。正則表達式還有其他流派,比如POSIX(Portable Operating System Interface for unix),它是一系列規范,定義了UNIX操作系統應當支持的功能,其中也包括了正則表達式的規范。
常見的[a-z]形式的字符組,在POSIX規范中仍然獲得支持,稱作POSIX方括號表達式。POSIX方括號表達式中的\不是用來轉義的,如[\d]就只能匹配\和d兩個字符。這里涉及到]、-這兩個特殊字符,在POSIX規范中,緊接在開方括號[之后的]才表示閉方括號字符,緊挨在閉方括號]之前的-才表示橫線字符。
對于PCRE規范中的\d、\w、\s等字符組簡記法,POSIX中有類似的東西,叫做POSIX字符組。在ASCⅡ語言環境(locale)中,常見的POSIX字符組及其含義如下:
POSIX字符組
說明
ACSⅡ字符組
等價的PCRE簡記法
[:alnum:]
字母和數字
[0-9a-zA-Z]
[:alpha:]
字母
[a-zA-Z]
[:ASCⅡ]
ASCⅡ字符
[\x00-\x7F]
[:blank:]
空格字符和制表字符
[ \t]
[:cntrl:]
控制字符
[\x00-\x1F\x7F]
[:digit:]
數字字符
[0-9]
\d
[:graph:]
空白字符之外的字符
[\x21-\x7E]
[:lower:]
小寫字母字符
[a-z]
[:print:]
類似[:graph:],但包括空白字符
[\x20-\x7E]
[:punct:]
標點符號
[][!"#$%&'()*+,./:;<=>?@\^_`{\
}~-]
[:space:]
空白字符
[ \t\r\n\v\f]
\s
[:upper:]
大寫字母
[A-Z]
[:word:]
字母字符
[A-Za-z0-9_]
\w
[:xdigit:]
十六進制字符
[A-Fa-f0-9]
php中有專門處理POSIX正則的函數,但從5.3.0開始已經廢棄了。這里只是了解一下相關知識。
2. 量詞
這里首先介紹一下^和$兩個特殊字符,在上一章的元字符與轉義一節提到過這兩個特殊字符。
^放在正則表達式的開頭,表示“定位到字符串的起始位置”;$用在正則表達式的末尾,表示“定位到字符串的結束位置”。
preg_match('/\w\d/', '1a2b'); // => 1
preg_match('/^\w\d/', '1a2b'); // => 0 必須以字母開頭
preg_match('/\w\d$/', '1a2b'); // => 0 必須以數字結尾
preg_match('/^\w\d/', 'a2b'); // => 1
preg_match('/\w\d$/', '1a2'); // => 1
preg_match('/^\w\d$/', '1a2'); // => 0 開頭必須是字母,結尾必須是數字
preg_match('/^\w\d$/', 'a2'); // => 1
量詞的一般形式
如果要匹配一個郵政編碼(6位數字),目前能寫出來的正則表達式是^\d\d\d\d\d\d$:
preg_match('/^\d\d\d\d\d\d$/', '100010'); // => 1
preg_match('/^\d\d\d\d\d\d$/', '10001035'); // => 0
preg_match('/^\d\d\d\d\d\d$/', '10a010'); // => 0
\d重復6次的寫法很不科學,正則表達式肯定會有更方便的寫法,也就是量詞(quantifier)。量詞的通用形式是{m,n}(注意,,后面不能有空格),它限定之前的元素能夠出現的次數,m是下限,n是上限。其他常見的量詞形式有:
量詞
說明
{n}
之前的元素必須出現n次
{m,n}
之前的元素最少出現m次,最多出現n次
{m,}
之前的元素最少出現m次,出現次數無上限
{0,n}
之前的元素可以不出現,也可以出現,最多出現n次
preg_match('/^\d{6}$/', '100010'); // => 1
preg_match('/^\d{4,6}$/', '123'); // => 0
preg_match('/^\d{4,6}$/', '1234'); // => 1
preg_match('/^\d{4,6}$/', '123456'); // => 1
preg_match('/^\d{4,6}$/', '1234567'); // => 0
常用量詞
正則表達式還有三個常用的量詞,分別是+、?、*:
常用量詞
{m,n}等價形式
說明
*
{0,}
可能出現,也可能不出現,出現次數沒有上限
+
{1,}
至少出現1次,出現次數沒有上限
?
{0,1}
出現0次或1次
這三種量詞在實際中使用的非常多。
例如,匹配url的時候,有可能是http,也有可能是https,這個時候用?就很方便:
preg_match('/^https?:\/\/www\.baidu\.com/', 'http://www.baidu.com'); // => 1
preg_match('/^https?:\/\/www\.baidu\.com/', 'https://www.baidu.com'); // => 1
在匹配html的tag(如
、、等)的時候,在中間會有字符,但是字符長度不確定。這種情況下就需要使用+了:preg_match('/^]+>$/', ''); // => 1
preg_match('/^]+>$/', ''); // => 1
preg_match('/^]+>$/', '<>'); // => 0
如果說匹配一個雙引號字符串,在雙引號內,既可以出現字符也可以不出現字符。這種情況下就應該使用量詞*。
preg_match('/^\"[^\"]*\"$/', '""'); // => 1
preg_match('/^\"[^\"]*\"$/', '"abcd"'); // => 1
點號
點號.是與量詞搭配比較多得一個字符。一般情況下,點號.可以匹配除了換行符\n以外的任意字符。
preg_match('/^.$/', 'z'); // => 1
preg_match('/^.$/', '8'); // => 1
preg_match('/^.$/', "\n"); // => 0
如果要使.能匹配的字符包含換行符\n,可以使用自制通配符\s\S或\w\W、\d\D。
preg_match('/^[\s\S]$/', "\n"); // => 1
使.能匹配的字符包含換行符\n的另外一種方法是指定正則匹配時使用單行模式。在php中,可以使用模式修飾符和預定義常量兩種方法來指定單行模式。關于正則匹配的模式,后面會詳細介紹。
preg_match('/(?s)^.$/', "\n"); // => 1 模式修飾符
preg_match('/^.$/s', "\n"); // => 1 預定義常量
匹配優先量詞、忽略優先量詞
很多語言中,都可以使用/*...*/來注釋代碼,如果是一個支持語法高亮的文本編輯器就要能夠提取/*...*/注釋塊。很easy的,我們可以寫出如下正則表達式:
$str = '/*this is a comment*/ /*this is another comment*/';
preg_match('/\/\*.*\*\//', $str, $arr);
echo $arr[0];
/*this is a comment*/ /*this is another comment*/
可以看到,這個正則表達式出了點小問題,它把兩個注釋塊匹配出來了,如果兩個注釋塊中間有代碼,那么代碼也會匹配出來。
這是因為,我們介紹的*、+、?都是匹配優先量詞(greedy quantifier,也稱貪婪量詞)。匹配優先量詞是指在拿不準是否要匹配的時候,優先嘗試匹配。因此,$str中間的*/ /*都被.*匹配了。
正則表達式中利用忽略優先量詞來解決上述問題。與*、+、?對應的忽略優先量詞的形式是*?、+?、??。忽略優先量詞在不確定是否要匹配時選擇“不匹配”的狀態。還是以提取注釋塊的代碼為例:
preg_match('/\/\*.*?\*\//', $str, $arr);
echo $arr[0];
/*this is a comment*/
這樣就達到了提取注釋塊的效果。
匹配優先量詞
忽略優先量詞
限定次數
*
*?
可能出現,可能不出現,出現次數沒有上限
+
+?
至少出現1次,沒有上限
?
??
出現0次或1次
{m,n}
{m,n}?
出現次數大于等于m,小于等于n
{m,}
{m,}?
至少出現m次,沒有上限
{0,n}
{0,n}?
出現0次-n次
php中有指定非貪婪匹配模式的模式修飾符和預定義常量,與忽略優先量詞是一樣的效果:
// 默認貪婪匹配
preg_match('/\/\*.*\*\//', $str, $arr); // => /*this is a comment*/ /*this is another comment*/
// 預定義常量 指定非貪婪匹配
preg_match('/\/\*.*\*\//U', $str, $arr); // => /*this is a comment*/
// 模式修飾符 指定非貪婪匹配
preg_match('/(?U)\/\*.*\*\//', $str, $arr); // => /*this is a comment*/
// 同時使用 忽略優先量詞 和 預定義常量
preg_match('/\/\*.*?\*\//U', $str, $arr); // => /*this is a comment*/ /*this is another comment*/
// 同時使用 忽略優先量詞 和 模式修飾符
preg_match('/(?U)\/\*.*?\*\//', $str, $arr); // => /*this is a comment*/ /*this is another comment*/
量詞的轉義
*、+、?的轉義比較簡單,就是\*、\+、\?。主要是{m,n}形式的轉義需要注意。
量詞
轉義
量詞
轉義
量詞
轉義
{n}
\\{n}
*
\*
*?
\*\?
{m,n}
\\{m,n}
+
\\+
+?
\\+\?
{m,}
\\{m,}
?
\?
??
\?\?
{0,n}
\\{0,n}
3.括號
分組
上一章介紹了量詞,上一章的例子中量詞都只能控制它前面的字符或字符組。那么量詞能否控制連續的字符或字符組呢,如控制一個單詞hello出現或者不出現。這就要用到正則表達式的分組功能(子表達式),使用圓括號(...)實現分組(子表達式)。
// 量詞限定前面一個字符
preg_match('/^hello?, world$/', 'hello, world'); // => 1
preg_match('/^hello?, world$/', 'hell, world'); // => 1
preg_match('/^hello?, world$/', ', world'); // => 0
// 量詞限定一個單詞
preg_match('/^(hello)?, world$/', 'hello, world'); // => 1
preg_match('/^(hello)?, world$/', 'hell, world'); // => 0
preg_match('/^(hello)?, world$/', ', world'); // => 1
多選結構
多選結構(alternative)的形式是(...|...),在括號內以豎線|分開多個子表達式,這些子表達式也叫多選分支(option)。
例如,匹配常見的11位手機號
// 匹配常見11位手機號
preg_match('/(13[0-9]|15[0-356]|18[025-9])\d{8}/', '18521510001', $arr); // => 1
引用分組
正則表達式會保存每個(...)分組匹配的文本,這種功能叫捕獲分組(capturing group)。在需要直接使用子表達式的時候非常有用
例如,提取標簽中的地址和描述文本
// 提取標簽中的地址和描述文本
preg_match('/(.*?)/', 'visit github', $arr);
print_r($arr);
/*
Array
(
[0] => github
[1] => github.com
[2] => visit github
)
*/
正則表達式替換時也支持捕獲分組。php中支持\num和$num的形式替換,但是num不能大于10;另一種形式${num}可以大于10。
例如,日期的替換
// 正則表達式替換
preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$1年$2月$3日', '2015-08-25'); // => 2015年08月25日
preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '\1年\2月\3日', '2015-08-25'); // => 2015年08月25日
反向引用
在正則表達式內部引用之前的捕獲分組匹配的文本叫反向引用(back-reference)。實測php支持\num形式的反向引用,不支持$num形式的反向引用
例如,利用反向引用匹配id相同的不同標簽
// 匹配id為main的標簽
preg_match('/.*?/', '
hello, world', $arr); // => 1print_r($arr);
/*
Array
(
[0] =>
hello, world[1] => div
)
*/
// 匹配id為main的標簽
preg_match('/.*?/', '
Hello, World
', $arr); // => 1print_r($arr);
/*
Array
(
[0] =>
Hello, World
[1] => p
)
*/
命名分組
數字編號的分組有時候不夠直觀,因此有些語言和工具的正則表達式提供了命名分組(named grouping)。
正則字符中(?P)來命名,(?P=name)來使用。preg_replace替換時不支持
// 捕獲命名分組
preg_match('/[^\'"\s]*)">(?P.*?)/', '', $arr);
print_r($arr);
/*
Array
(
[0] => visit github
[link] => github.com
[1] => github.com
[description] => visit github
[2] => visit github
)
*/
// 反向引用命名分組
preg_match('/[\w]+)\s+id="main">.*?/', '
hello, world', $arr);print_r($arr);
/*
Array
(
[0] =>
hello, world[tag] => div
[1] => div
)
*/
非捕獲分組
正則表達式默認會保存每個(...)匹配的文本,前面利用這個特性可以實現一些有用的功能。但是,有時候正則表達式比較復雜,(...)會出現的比較多,而此時僅僅是想實現分組或者多選的功能,而不需要捕獲分組;同時,大量不需要的捕獲分組可能會影響性能。
為了解決這種問題,正則表達式提供了非捕獲分組(non-capturing group),它的形式是(?:...)。
// 捕獲分組
preg_match('/(13[0-9]|15[0-356]|18[025-9])\d{8}/', '18521510001', $arr); // => 1
print_r($arr);
/*
Array
(
[0] => 18521510001
[1] => 185
)
*/
// 非捕獲分組
echo preg_match('/(?:13[0-9]|15[0-356]|18[025-9])\d{8}/', '18521510001', $arr); // => 1
print_r($arr);
/*
Array
(
[0] => 18521510001
)
*/
4.斷言
正則表達式中的有些結構不匹配真正的文本,只負責判斷在某個位置左/右側的文本是否符合要求,這種結構稱為斷言(assertion)。常見的斷言有三類:單詞邊界、行起始/結束位置、環視。
單詞邊界
單詞邊界(word boundary),記為\b。它匹配的是單詞邊界(一邊是單詞字符,另一邊不是單詞字符)的位置,而不是字符。
// 單詞邊界
preg_match('/\b\w+\b/', 'word', $arr); // => 1
print_r($arr);
/*
Array
(
[0] => word
)
*/
// 匹配所有單詞邊界
preg_match_all('/\b\w+\b/', 'hello, world', $arr); // => 2
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => hello
[1] => world
)
)
*/
這類匹配位置而不匹配字符的元素叫做錨點(anchor),下一節要介紹的^、$等也是錨點。
行起始/結束位置
^:字符串的開始位置
$:字符串的結束位置
$str = 'first line
second line
last line';
// 字符串起始位置
preg_match_all('/^\w+\b/', $str, $arr); // => 1
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => first
)
)
*/
// 字符串結束位置
preg_match_all('/\b\w+$/', $str, $arr); // => 1
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => line
)
)
*/
如果指定了多行模式(Multiline Mode),^、$分別可以匹配行起始位置、行結束位置。關于模式,將在下一章詳細介紹。指定多行模式的方式是使用模式修飾符(?m):在正則表達式之前加上(?m);或者是預定義常量的方式:/.../m 。
// 多行模式 行起始位置
// preg_match_all('/^\w+\b/m', $str, $arr); 是一樣的效果
preg_match_all('/(?m)^\w+\b/', $str, $arr); // => 3
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => first
[1] => second
[2] => last
)
)
*/
//多行模式 行結束位置
// preg_match_all('/\b\w+$/m', $str, $arr); 是一樣的效果
preg_match_all('/(?m)\b\w+$/', $str, $arr); // => 3
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => line
[1] => line
[2] => line
)
)
*/
\A不論是普通模式還是多行模式,都匹配字符串起始位置
\Z、\z不論是普通模式還是多行模式,都匹配字符串結束位置
\Z與\z的區別在于最后字符串的末尾是行終止符的時候,\Z匹配行終止符之前的位置,\z則不管行終止符,只匹配“整個字符串的結束位置”。
這里用行終止符,而不用換行符的原因是不同操作系統的行終止符不同(windows\r\n,linux\n,mac\n)。
// \A 始終匹配字符串起始位置
preg_match_all('/\A\w+\b/', $str, $arr); // => 1
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => first
)
)
*/
preg_match_all('/(?m)\A\w+\b/', $str, $arr); // => 1
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => first
)
)
*/
// \Z始終匹配行結束位置
preg_match_all('/\b\w+\Z/', $str, $arr); // => 1
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => line
)
)
*/
preg_match_all('/(?m)\b\w+\Z/', $str, $arr); // => 1
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => line
)
)
*/
// \Z \z的區別
$str = 'first line
second line
last line
';
preg_match_all('/(?m)\b\w+\z/', $str, $arr); // => 0
print_r($arr);
/*
Array
(
[0] => Array
(
)
)
*/
preg_match_all('/(?m)\b\w+\Z/', $str, $arr); // => 1
print_r($arr);
/*
Array
(
[0] => Array
(
[0] => line
)
)
*/
環視
環視(look-around)用來“停在原地,四處張望”,它本身也不匹配任何字符,用來限定它旁邊的文本滿足某種條件。
名字
記法
含義
肯定順序環視
(?=...)
向右看看,右邊出現了環視中的內容才匹配
否定順序環視
(?!...)
向右看看,右邊不出現環視中的內容才匹配
肯定逆序環視
(?<=...)
向左看看,左邊出現了環視中的內容才匹配
否定逆序環視
(?
向左看看,左邊不出現環視中的內容才匹配
例如,要匹配html標簽中的開標簽(、
、等),而不能匹配閉標簽(、、等)和自閉和標簽(等),同時,也不能匹配一個空的標簽<>。
直接使用將/字符排除是不對的,因為有些標簽的屬性中可能會含有/字符。例如。這里只是在開尖括號之前的第一個字符不能為/。
然而]*[^\/]>也是不行的,因為在之間會至少匹配兩個字符,像這樣的標簽是無法匹配到的。這里就要用到環視了。
上面的正則表達式中有兩個環視結構,一個在開尖括號之前,表示在閉尖括號>之前向左看看,左邊挨著的字符不能為/。
上面的正則表達式已經解決了匹配html中開標簽的主要問題,只是其中的.*?還需要優化一下。需要解決的問題是:
有可能會有單引號'或雙引號",它們都得成對出現
單引號對或雙引號對之內可以有>字符,但是它們的外面不能有>字符
利用正則表達式的選擇結構,可以寫出下面的表達式,用于完善上面的問題。
])+(?
5.匹配模式
前面的內容中已經出現介過了單行模式、多行模式、非貪婪模式。匹配模式是指匹配時使用的規則。常用的匹配模式還有不區分大小寫模式、注釋模式。
在開始介紹具體的模式之前,先介紹php中模式的兩種具體實現/.../{modifier}和...(?{modifier})...:
模式修飾符
/.../{modifier}
...(?{modifier})...
示例
/
.*/s(?s).*名稱(php手冊)
模式修飾符
模式內修飾符
名稱(《正則指引》)
預定義常量
模式修飾符
作用范圍
整個正則表達式
不在分組(子表達式)中時,對它后面的全部正則表達式起作用;如果在分組(子表達式)中,則對它分組中的剩余部分起作用。在沒有分組,且放在整個正則表達式最前面的時候相當于/.../{modifier}
支持程度
支持所有模式修飾符
支持部分模式修飾符
其他編程語言
可能不支持
一般都支持
不區分大小寫模式
在html中是不區分大小寫的,例如
和、、的作用是一樣的。如果要從網頁中提取,不使用匹配模式的表達式應該是這樣:由于
標簽只有兩個字符,所以上面的寫法還可以接受。但是如果標簽是world';preg_match('/
.*<\/tr>/', $str, $arr);print_r($arr);
/*
Array
(
[0] =>
helloworld)
*/
// 非貪婪匹配模式
$str = '
helloworld';preg_match('/
.*<\/tr>/U', $str, $arr);print_r($arr);
/*
Array
(
[0] =>
hello)
*/
Unicode
要匹配中文等Unicode字符,最好是指定Unicode模式修飾符/.../u。如果不指定會有兩個問題
GBK編碼環境下,中文不能匹配
無法利用[\x{4e00}-\x{9fff}]匹配中文
// 指定unicode模式
preg_match('/
[\x{4e00}-\x{9fff}]*<\/td>/u', '姚明', $arr);print_r($arr);
/*
Array
(
[0] =>
姚明)
*/
總結
以上是生活随笔為你收集整理的正则环视 php,正则表达式基本知识(php)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 粗粮吃得越多越养胃吗?蚂蚁庄园3.1日答
- 下一篇: php类库下载下来怎么使用,PHP如何实