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 →