PHP

preg_match

preg_match

(PHP 4, PHP 5, PHP 7)

preg_match - 执行正则表达式匹配

描述

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

搜索主题与模式中给定的正则表达式匹配。

参数

pattern

作为字符串搜索的模式。

subject

输入字符串。

matches

如果提供了匹配,则会填充搜索结果。 $ matches0将包含匹配完整模式的文本,$ matches1将包含匹配第一个捕获的括号内的子模式的文本,依此类推。

flags

flags 可以是以下标志:

PREG_OFFSET_CAPTURE

如果此标志被传递,则对于每次发生的匹配,附属字符串偏移量也将被返回。 请注意,这会将匹配值更改为数组,其中每个元素都是由偏移量为0的匹配字符串组成的数组,并且它的字符串偏移量为偏移量为1的主体。

<?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 ) )

`offset`

通常,搜索从主题字符串的开始处开始。 可选参数偏移量可用于指定开始搜索的替代位置(以字节为单位)。

注意:由于可以包含诸如^,$或(?<= x)的 断言,因此使用offset不等同于将substr($ subject,$ offset)传递给preg_match()以代替主题字符串。比较:<?php $ subject =“abcdef”; $ pattern ='/ ^ def /'; preg \ _match($ pattern,$ subject,$ matches,PREG \ _OFFSET \ _CAPTURE,3); 打印\ _r($比赛); ?>上面的例子会输出:Array(),而这个例子<?php $ subject =“abcdef”; $ pattern ='/ ^ def /'; preg \ _match($ pattern,substr($ subject,3),$ matches,PREG \ _OFFSET \ _CAPTURE); 打印\ _r($比赛); ?>将产生Array(0 => Array(0 => def 1 =>)patternsubstr()中,使用\ G断言而不是^ anchor,或者使用A修饰符,它们都与offset参数一起工作。

返回值

preg_match()返回1,如果模式匹配给定主题,则返回0;否则返回FALSE。

警告

此函数可能会返回布尔FALSE,但也可能会返回一个非布尔值,其值为FALSE。 有关更多信息,请阅读布尔部分。 使用===运算符来测试此函数的返回值。

更新日志

描述
5.3.6如果偏移高于主题长度,则返回FALSE。
5.2.2已命名的子模式现在接受语法(?<名称>)和(?'名称')以及(?P <名称>)。以前的版本只接受(?P <名称>)。

例子

示例#1 查找字符串“php”

<?php // The "i" after the pattern delimiter indicates a case-insensitive search 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 找到词汇“web”

<?php /* The \b in the pattern indicates a word boundary, so only the distinct  * word "web" is matched, and not a word partial like "webbing" or "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 // get host name from URL preg_match('@^(?:http://)?([^/]+)@i',     "http://www.php.net/index.html", $matches $host = $matches[1]; // get last two segments of host name 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 /* This also works in PHP 5.2.2 (PCRE 7.0) and later, however   * the above form is recommended for backwards compatibility */ // 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(),因为它会更快。

扩展内容

  • preg_quote() - 引用正则表达式字符

  • preg_match_all() - 执行全局正则表达式匹配

  • preg_replace() - 执行正则表达式搜索并替换

  • preg_split() - 用正则表达式分割字符串

  • preg_last_error() - 返回上一次PCRE正则表达式执行的错误代码

← preg_match_all

preg_quote →