1. 一次匹配
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
返回值 0 | 1 (未匹配|匹配到了)
<?php
/**
* $pattern 待搜索的模式 模式中有多少() 就有多少元素在 matches中返回
索引为0 时 返回全匹配数组
* $subject 输入字符串
* $matches 匹配结果数组
* $flags 设置 PREG_OFFSET_CAPTURE 会将
* $offset 偏移量
*/
$subject = "defabc__defdef";
$pattern = '/def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 9);
print_r($matches);
?>
输出结果:
加参数:PREG_OFFSET_CAPTURE
Array([0] => Array( [0] => def [1] => 11 ))
不加传0:
Array([0] => def )
2. 检索所有匹配
int preg_match_all(string $pattern ,string $subject[, array &$matches[, int $flags = PREG_PATTERN_ORDER[, int $offset = 0 ]]])
返回值:匹配次数
同上 忽略
3. 匹配替换
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
<?php
/**
* $pattern 匹配模式
* $replacement 替换模式
replacement
用于替换的字符串或字符串数组。如果这个参数是一个字符串,并且pattern 是一个数组,
那么所有的模式都使用这个字符串进行替换。如果pattern和replacement 都是数组,
每个pattern使用replacement中对应的 元素进行替换。如果replacement中的元素比pattern中的少,
多出来的pattern使用空字符串进行替换。
replacement中可以包含后向引用\\n 或(php 4.0.4以上可用)$n,语法上首选后者。
每个 这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。
n 可以是0-99,\\0和$0代表完整的模式匹配文本。 捕获子组的序号计数方式为:代表捕获子组的左括号从左到右,
从1开始数。如果要在replacement 中使用反斜线,必须使用4个("\\\\",译注:因为这首先是php的字符串,经过转义后,
是两个,再经过 正则表达式引擎后才被认为是一个原文反斜线)。
当在替换模式下工作并且后向引用后面紧跟着需要是另外一个数字(比如:在一个匹配模式后紧接着增加一个原文数字),
不能使用\\1这样的语法来描述后向引用。比如, \\11将会使preg_replace() 不能理解你希望的是一个\\1后向引用紧跟
一个原文1,还是 一个\\11后向引用后面不跟任何东西。 这种情况下解决方案是使用\${1}1。
这创建了一个独立的$1后向引用, 一个独立的原文1。
* $subject 输入串
* $limit 每个模式在每个subject上进行替换的最大次数。默认是 -1(无限)。
* $count 如果指定,将会被填充为完成的替换次数。
*/
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('$3/$4/$1$2', '$$1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
?>
返回值:
$startDate = 5/27/1999
4. 过滤匹配
mixed preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
和 preg_replace 相似 只是没匹配到的时候 replace 会返回原串 filter 则返回空
5. 数组过滤匹配
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
<?php
/**
* pattern 要搜索的模式, 字符串形式.
* input 输入数组.
* flags 如果设置为PREG_GREP_INVERT, 这个函数返回输入数组中与 给定模式pattern不匹配的元素组成的数组.
*/
$array = array("23.32","22","12.009","23.43.43");
var_dump(preg_grep("/^(\d+)?\.\d+\.\d+$/",$array));
var_dump(preg_grep("/^(\d+)?\.\d+\.\d+$/",$array,0)); //同上 返回匹配到的数组元素
var_dump(preg_grep("/^(\d+)?\.\d+\.\d+$/",$array,1)); //返回不匹配的数组元素
?>
返回结果:
array (size=1)
3 => string '23.43.43' (length=8)
array (size=1)
3 => string '23.43.43' (length=8)
array (size=3)
0 => string '23.32' (length=5)
1 => string '22' (length=2)
2 => string '12.009' (length=6)
6. 字符串拆成数组
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
<?php
/**
* pattern 用于搜索的模式,字符串形式。
* subject 输入字符串
* limit 如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。
limit值为-1, 0或null时都代表"不限制", 作为php的标准,你可以使用null跳过对flags的设置。
* flags flags 可以是任何下面标记的组合(以位或运算 | 组合):
PREG_SPLIT_NO_EMPTY 如果这个标记被设置, preg_split() 将进返回分隔后的非空部分。
PREG_SPLIT_DELIM_CAPTURE 如果这个标记设置了,用于分隔的模式中的括号表达式将被捕获并返回。
PREG_SPLIT_OFFSET_CAPTURE 如果这个标记被设置, 对于每一个出现的匹配返回时将会附加字符串偏移量.
注意:这将会改变返回数组中的每一个元素, 使其每个元素成为一个由第0 个元素为分隔后的子串,第1个元素为该子串在subject 中的偏移量组成的数组。
*/
//使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语
$keywords = preg_split("/[\s,!]+/", "hello,world! I am coming");
var_dump($keywords);
?>
输出:
array (size=5)
0 => string 'hello' (length=5)
1 => string 'world' (length=5)
2 => string 'I' (length=1)
3 => string 'am' (length=2)
4 => string 'coming' (length=6)
7. 正则表达式 特殊符号转义
string preg_quote ( string $str [, string $delimiter = NULL ] )将特殊的正则匹配中 需要转义的字符 加上转义符 '\'
<?php
//在这个例子中,preg_quote($word) 用于保持星号原文涵义,使其不使用正则表达式中的特殊语义。
$textbody = "This book is *very* difficult to find.";
$word = "*very*";
$textbody = preg_replace ("/" . preg_quote($word) . "/",
"<i>" . $word . "</i>",
$textbody);
?>
8. 用匿名回调函数处理匹配字符串
mixed preg_replace_callback(mixed $pattern, callable $callback, mixed $subject[, int $limit = -1 [, int &$count ]])
这个函数的行为除了 可以指定一个 callback 替代 replacement 进行替换 字符串的计算,其他方面等同于 preg_replace()。
<?php
/**
* pattern 要搜索的模式,可以使字符串或一个字符串数组。
* callback 一个回调函数,在每次需要替换时调用,调用时函数得到的参数是从subject 中匹配到的结果。
回调函数返回真正参与替换的字符串。这是该回调函数的签名:
* string handler ( array $matches ) 你可能经常会需要callback函数而 仅用于preg_replace_callback()一个地方的调用。
在这种情况下,你可以 使用匿名函数来定义一个匿名函数作 为preg_replace_callback()调用时的回调。
这样做你可以保留所有 调用信息在同一个位置并且不会因为一个不在任何其他地方使用的回调函数名称而污染
函数名称空间。
* subject 要搜索替换的目标字符串或字符串数组。
* limit 对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
* count 如果指定,这个变量将被填充为替换执行的次数。
*/
#一个unix样式的命令行过滤器,用于将段落开始部分的大写字母转换为小写。
$fp = fopen("php://stdin", "r") or die("can't read stdin");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
function ($matches) {
return strtolower($matches[0]);
},
$line
);
echo $line;
}
fclose($fp);
?>
9. 用多个匿名回调函数处理字符串
mixed preg_replace_callback_array( array $patterns_and_callbacks , mixed $subject [, int $limit = -1 [, int &$count ]] )
使用同 8 ,只是模式是一个数组
<?php
$subject = 'Aaaaaa Bbb';
preg_replace_callback_array(
[
'~[a]+~i' => function ($match) {
echo strlen($match[0]), ' matches for "a" found', PHP_EOL;
},
'~[b]+~i' => function ($match) {
echo strlen($match[0]), ' matches for "b" found', PHP_EOL;
}
],
$subject
);
?>
每天学点函数,用时你就拥有整个库。