preg_match
(PHP 4, PHP 5, PHP 7, PHP 8)
preg_match — 執行匹配正規表示式
說明
string
$pattern
,string
$subject
,array
&$matches
= null
,int
$flags
= 0,int
$offset
= 0): int|false
搜索subject
與pattern
給定的正規表示式的一個匹配.
參數
-
pattern
-
要搜索的模式,字串型別。
-
subject
-
輸入字串。
-
matches
-
如果提供了參數
matches
,它將被填充為搜索結果。 $matches[0]將包含完整模式匹配到的文字, $matches[1] 將包含第一個捕獲子組匹配到的文字,以此類推。 -
flags
-
flags
可以被設定為以下標記值的組合:-
PREG_OFFSET_CAPTURE
-
如果傳遞了這個標記,對於每一個出現的匹配返回時會附加字串偏移量(相對於目標字串的位元組數)。 注意:這會改變填充到
matches
參數的陣列,使其每個元素成為一個由 第0
個元素是匹配到的字串,第1
個元素是該匹配字串 在目標字串subject
中的偏移量。<?php
preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>以上例程會輸出:
Array ( [0] => Array ( [0] => foobarbaz [1] => 0 ) [1] => Array ( [0] => foo [1] => 0 ) [2] => Array ( [0] => bar [1] => 3 ) [3] => Array ( [0] => baz [1] => 6 ) )
-
PREG_UNMATCHED_AS_NULL
-
使用該標記,未匹配的子組會報告為
null
;未使用時,報告為空的 string。<?php
preg_match('/(a)(b)*(c)/', 'ac', $matches);
var_dump($matches);
preg_match('/(a)(b)*(c)/', 'ac', $matches, PREG_UNMATCHED_AS_NULL);
var_dump($matches);
?>以上例程會輸出:
array(4) { [0]=> string(2) "ac" [1]=> string(1) "a" [2]=> string(0) "" [3]=> string(1) "c" } array(4) { [0]=> string(2) "ac" [1]=> string(1) "a" [2]=> NULL [3]=> string(1) "c" }
-
-
offset
-
通常,搜索從目標字串的開始位置開始。可選參數
offset
用於 指定從目標字串的某個位置開始搜索(單位是位元組)。注意:
使用
offset
參數不同於向preg_match() 傳遞按照位置通過substr($subject, $offset)
擷取目標字串結果, 因為pattern
可以包含斷言比如^, $ 或者(?<=x)。 比較:<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>以上例程會輸出:
Array ( )
當這個示例使用擷取後傳遞時
<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>將會產生匹配
Array ( [0] => Array ( [0] => def [1] => 0 ) )
要避免使用 substr(),可以用
\G
斷言而不是^
錨,或者A
修改器,它們都能和offset
參數一起執行。
返回值
preg_match()返回 pattern
的匹配次數。
它的值將是0次(不匹配)或1次,因為preg_match()在第一次匹配后
將會停止搜索。preg_match_all()不同於此,它會一直搜索subject
直到到達結尾。
如果發生錯誤preg_match()返回 false
。
更新日誌
版本 | 說明 |
---|---|
7.2.0 |
現在 $flags 參數支援 PREG_UNMATCHED_AS_NULL 。
|
範例
示例 #1 查詢文字字串"php"
<?php
//模式分隔符后的"i"標記這是一個大小寫不敏感的搜索
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>
示例 #2 查詢單詞"word"
<?php
/* 模式中的\b標記一個單詞邊界,所以只有獨立的單詞"web"會被匹配,而不會匹配
* 單詞的部分內容比如"webbing" 或 "cobweb" */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>
示例 #3 獲取URL中的域名
<?php
//從URL中獲取主機名稱
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[1];
//獲取主機名稱的後面兩部分
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>
以上例程會輸出:
domain name is: php.net
示例 #4 使用命名子組
<?php
$str = 'foobar: 2008';
preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
/* 可選的方式 */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);
print_r($matches);
?>
以上例程會輸出:
Array ( [0] => foobar: 2008 [name] => foobar [1] => foobar [digit] => 2008 [2] => 2008 )
註釋
如果你僅僅想要檢查某個字串是否包含另外一個字串,不要使用preg_match()。 使用 strpos() 會更快。
參見
- PCRE 模式
- preg_quote() - 轉義正規表示式字元
- preg_match_all() - 執行一個全域性正規表示式匹配
- preg_replace() - 執行一個正規表示式的搜索和替換
- preg_split() - 通過一個正規表示式分隔字串
- preg_last_error() - 返回最後一個PCRE正則執行產生的錯誤程式碼
- preg_last_error_msg() - Returns the error message of the last PCRE regex execution