preg_match 函数:
// preg_match 执行匹配正则表达式
// 参数说明:
// $pattern 必传参数,正则表达式,字符串类型
// $subject 必传参数,进行匹配的字符串
// &$matches 可选参数,匹配完整结果,$matches[0]将包含完整模式匹配到的文本,
// $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推
// $flags 可选参数,匹配返回时会附加字符串偏移量(PREG_OFFSET_CAPTURE)。
// $offset 可选参数,搜索目标字符串的开始位置
// 返回值说明: 返回匹配次数,在第一次匹配后将会停止搜索,发生错误返回 FALSE。
// 实例-1
preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches);
print_r($matches);
// 输出:
// Array
// (
// [0] => foobarbaz
// [1] => foo
// [2] => bar
// [3] => baz
// )
// 实例-2
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
// )
// )
// 实例-3
$subject = "abcdef";
$pattern = '/^def/';
// 匹配失败,因为$pattern可以包含断言比如^, $ 或者(?<=x)。
// preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
// Array
// (
// [0] => Array
// (
// [0] => def
// [1] => 0
// )
// )
// 实例 - 4
// 模式中的\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."; // 输出当前值
}
// 实例 - 5
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
preg_match_all 函数:
// preg_match_all 执行一个全局正则表达式匹配
// 参数说明:
// $pattern 必传参数,正则表达式,字符串类型
// $subject 必传参数,进行匹配的字符串
// &$matches 可选参数,多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定
// $flags 可选参数,(PREG_PATTERN_ORDER、PREG_OFFSET_CAPTURE、 PREG_SET_ORDER)
// PREG_PATTERN_ORDER:结果排序为$matches[0]保存完整模式的所有匹配,
// $matches[1] 保存第一个子组的所有匹配,以此类推;
// PREG_SET_ORDER:结果排序为$matches[0]包含第一次匹配得到的所有匹配,
// $matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推
// $offset 可选参数,搜索目标字符串的开始位置
// 返回值说明: 完整匹配次数(可能是0),或者如果发生错误返回FALSE
// 实例-1
preg_match_all("|<[^>]+>(.*)</[^>]+>|U","<b>example: </b><div align=left>this is a test</div>", $out, PREG_PATTERN_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";
preg_split 函数:
// preg_split 通过一个正则表达式分隔字符串
// 参数说明:
// $pattern 必传参数,正则表达式,字符串类型
// $subject 必传参数,进行匹配的字符串
// $limit 可选参数,限制分隔得到的字符串,返回的最后一个子串将包含所有剩余部分;
// $flags 可选参数,(PREG_SPLIT_NO_EMPTY、PREG_SPLIT_DELIM_CAPTURE、 PREG_SPLIT_OFFSET_CAPTURE)
// PREG_SPLIT_NO_EMPTY:返回分隔后的非空部分
// PREG_SPLIT_DELIM_CAPTURE:用于分隔的模式中的括号表达式将被捕获并返回
// PREG_SPLIT_OFFSET_CAPTURE:对于每一个出现的匹配返回时将会附加字符串偏移量
// 返回值说明: 返回分割后子串组成的数组, 或者在失败时返回 FALSE
// 实例-1
// 使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
preg_grep 函数:
// preg_grep 返回匹配模式的数组条目
// 参数说明:
// $pattern 必传参数,正则表达式,字符串类型
// $input 必传参数,输入数组
// $flags 可选参数,PREG_GREP_INVERT
// PREG_GREP_INVERT:返回输入数组中不匹配的数组元素
// 返回值说明: 返回匹配到的索引数组
// 实例-1
// 返回所有包含浮点数的元素
$arr = ['1.25','this',10];
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $arr);
var_dump($fl_array);
preg_replace_callback 函数:
// preg_replace_callback 执行一个正则表达式搜索并且使用一个回调进行替换
// preg_grep 返回匹配模式的数组条目
// 参数说明:
// $pattern 必传参数,正则表达式,字符串类型
// $callback 必传参数,每次需要替换时调用,调用时函数得到的参数是匹配到的结果
// $subject 必传参数,要搜索替换的目标字符串或字符串数组
// $limit 可选参数,最大可替换次数,默认是-1(无限制)
// &$count 可选参数,替换执行的次数
// 返回值说明: 如果subject是一个数组, 返回一个数组,其他情况返回字符串,错误发生时返回 NULL
// 实例-1
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
function next_year($matches)
{
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);