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 =>)pattern
substr()中,使用\ 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 →
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com