您現在的位置是:首頁 > PHP基礎

preg_match

李清波2017-12-11PHP基礎

preg_match

(PHP 4, PHP 5)

preg_match執行一個正則表達式匹配

說明

int preg_match    ( string $pattern   , string $subject   [, array &$matches   [, int $flags = 0   [, int $offset = 0  ]]] )

搜索subject與pattern給定的正則表達式的一個匹配.

參數

pattern

要搜索的模式,字符串類型。

subject

輸入字符串。

matches

如果提供了參數matches,它將被填充為搜索結果。$matches[0]將包含完整模式匹配到的文本,$matches[1]將包含第一個捕獲子組匹配到的文本,以此類推。

flags

flags可以被設置為以下標記值:





PREG_OFFSET_CAPTURE


如果傳遞了這個標記,對于每一個出現的匹配返回時會附加字符串偏移量(相對于目標字符串的)。        


注意:這會改變填充到matches參數的數組,使其每個元素成為一個由第0個元素是匹配到的字符串,第1個元素是該匹配字符串在目標字符串subject中的偏移量。          

offset

通常,搜索從目標字符串的開始未知開始。可選參數 offset 用于      指定從目標字符串的某個未知開始搜索(單位是字節)。


Note:

使用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
        )

)


返回值

preg_match()返回 pattern 的匹配次數。  它的值將是0次(不匹配)或1次,因為 preg_match()在第一次匹配后  將會停止搜索。 preg_match_all()不同于此,它會一直搜索subject   直到到達結尾。   如果發生錯誤 preg_match()返回 FALSE

更新日志


版本說明
5.3.6如果 offsetsubject 的長度還要大則返回 FALSE
5.2.2命名子組可以接受(?<name>)(?'name')        以及(?P<name>)語法。之前版本僅接受(?P<name>)語法。
4.3.3增加了參數offset.
4.3.0增加了標記PREG_OFFSET_CAPTURE
4.3.0增加了參數flags


范例


Example #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.";
}
?>


Example #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.";
}
?>



Example #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



Example #4 使用命名子組

<?php

$str = 'foobar: 2008';

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

/* 下面例子在php 5.2.2(pcre 7.0)或更新版本下工作, 然而, 為了后向兼容, 上面的方式是推薦寫法. */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>


以上例程會輸出:

Array
(
[0] => foobar: 2008
[name] => foobar
[1] => foobar
[digit] => 2008
[2] => 2008
)


注釋

Tip    

如果你僅僅想要檢查一個字符串是否包含另外一個字符串,不要使用 preg_match()。   使用 strpos()strstr()替代完成工作會更快。

參見


PCRE 模式

preg_match_all() - 執行一個全局正則表達式匹配

preg_replace() - 執行一個正則表達式的搜索和替換

preg_split() - 通過一個正則表達式分隔字符串

preg_last_error() - 返回最后一個PCRE正則執行產生的錯誤代碼


評論