PHP中如何使用preg_replace函数用正则表达式替换字符串
preg_replace函数是PHP中用于执行全局正则表达式搜索和替换的函数。它的语法如下:
preg_replace(pattern, replacement, subject);
其中,pattern为正则表达式模式,replacement为用于替换的字符串或回调函数,subject为要进行搜索和替换的字符串。这个函数将返回被替换的字符串。
下面我们分别介绍一下pattern、replacement和subject这三个参数的用法和注意事项。
1. pattern参数
pattern参数是一个正则表达式模式,用于指定搜索条件。在模式中可以包含普通字符、元字符和模式修饰符。
1.1 普通字符
普通字符就是指字母、数字、空格和标点符号等。在模式中,普通字符只会匹配相应的字符,例如:
$str = "hello world"; $pattern = "/world/"; $replacement = "PHP"; echo preg_replace($pattern, $replacement, $str); //输出hello PHP
1.2 元字符
元字符是指在正则表达式中具有特殊意义的字符。例如,^、$、*、+、?、.、|、{、}、[]、()、\等字符都是元字符。下面我们逐个来讲解。
1.2.1 ^和$
^和$分别表示匹配字符串的开头和结尾:
$str = "hello world"; $pattern1 = "/^hello/"; $pattern2 = "/world$/"; $replacement = "PHP"; echo preg_replace($pattern1, $replacement, $str); //输出PHP world echo preg_replace($pattern2, $replacement, $str); //输出hello PHP
1.2.2 *
*表示匹配前面的字符出现0次或多次:
$str = "hello world"; $pattern = "/l*/"; $replacement = "-"; echo preg_replace($pattern, $replacement, $str); //输出he-o wor-d
1.2.3 +
+表示匹配前面的字符出现1次或多次:
$str = "hello world"; $pattern = "/l+/"; $replacement = "-"; echo preg_replace($pattern, $replacement, $str); //输出he-o wor-d
1.2.4 ?
?表示匹配前面的字符出现0次或1次:
$str = "hello world"; $pattern = "/lo?/"; $replacement = "-"; echo preg_replace($pattern, $replacement, $str); //输出hel-o world
1.2.5 .
.表示匹配除换行符以外的任意一个字符:
$str = "hello world"; $pattern = "/o./"; $replacement = "-"; echo preg_replace($pattern, $replacement, $str); //输出hell- w-rld
1.2.6 |
|表示或的关系,即匹配两种或以上的模式:
$str = "hello world"; $pattern = "/(hello|world)/"; $replacement = "PHP"; echo preg_replace($pattern, $replacement, $str); //输出PHP PHP
1.2.7 {}
{}表示匹配前面的字符重复出现的次数。例如,{3,}表示至少重复3次,{3,5}表示重复3到5次:
$str = "hello world";
$pattern = "/l{2,}/";
$replacement = "-";
echo preg_replace($pattern, $replacement, $str); //输出he-o wor-d
1.2.8 []
[]表示匹配一组字符中的任意一个。例如,[abc]表示匹配a或b或c,[a-z]表示匹配a到z之间的任意一个字符:
$str = "hello world"; $pattern = "/[aeiou]/"; $replacement = "-"; echo preg_replace($pattern, $replacement, $str); //输出h-ll- w-rld
1.2.9 ()
()表示分组,将匹配模式分成一组,可以在替换的时候使用\\1、\\2等引用分组:
$str = "2022-02-02";
$pattern = "/(\d{4})-(\d{2})-(\d{2})/";
$replacement = "$2/$3/$1";
echo preg_replace($pattern, $replacement, $str); //输出02/02/2022
1.2.10 \
\表示转义字符,用于将元字符转义成普通字符。例如,\\表示转义成\,\+表示转义成+等。
$str = "hello+world"; $pattern = "/\+/"; $replacement = "-"; echo preg_replace($pattern, $replacement, $str); //输出hello-world
1.3 修饰符
修饰符可以修改正则表达式模式的行为。在PHP中,常用的修饰符有:i、s、m、u、x。
1.3.1 i
i修饰符表示不区分大小写:
$str = "Hello World"; $pattern = "/hello/i"; $replacement = "PHP"; echo preg_replace($pattern, $replacement, $str); //输出PHP World
1.3.2 s
s修饰符表示将字符串视为单行模式。在单行模式下,.可以匹配换行符:
$str = "hello
world";
$pattern = "/o.world/s";
$replacement = "-";
echo preg_replace($pattern, $replacement, $str); //输出hell-
// world
1.3.3 m
m修饰符表示将字符串视为多行模式。在多行模式下,^和$可以匹配每一行的开头和结尾:
$str = "hello
world";
$pattern = "/^h/m";
$replacement = "PHP";
echo preg_replace($pattern, $replacement, $str); //输出PHPello
// world
1.3.4 u
u修饰符表示将模式视为UTF-8编码下的Unicode字符串:
$str = "你好,世界!";
$pattern = "/[\x{4e00}-\x{9fa5}]+/u"; //匹配中文字符
$replacement = "-";
echo preg_replace($pattern, $replacement, $str); //输出-,!
1.3.5 x
x修饰符表示忽略空白字符(换行符、制表符和空格),可以让正则表达式更加易读:
$str = "hello world"; $pattern = "/h e l l o/x"; $replacement = "PHP"; echo preg_replace($pattern, $replacement, $str); //输出PHP world
2. replacement参数
replacement参数是一个字符串或回调函数,用于指定替换内容。
2.1 字符串替换
当replacement参数是一个字符串时,替换内容将会是一个静态字符串,不会随着搜索模式的变化而变化。例如:
$str = "hello world"; $pattern = "/world/"; $replacement = "PHP"; echo preg_replace($pattern, $replacement, $str); //输出hello PHP
2.2 回调函数替换
当replacement参数是一个回调函数时,替换内容将会是一个动态字符串,可以根据搜索模式的变化而变化。回调函数必须接受一个matches数组参数,代表当前匹配的所有分组。例如:
$str = "2022-02-02";
$pattern = "/(\d{4})-(\d{2})-(\d{2})/";
$replacement = function($matches){
return $matches[2].'/'.$matches[3].'/'.$matches[1];
};
echo preg_replace_callback($pattern, $replacement, $str); //输出02/02/2022
3. subject参数
subject参数是要进行搜索和替换的字符串。可以是一个字符串或字符串数组。
`php
$str = "hello world";
$pattern = "/world/";
$replacement = "PHP";
echo preg_replace($pattern, $replacement, $str); //输出hello PHP
$str = array("hello world", "hello php");
$pattern = "/hello/";
$replacement = "hi";
echo preg_replace($pattern, $replacement, $str); //输出hi world、hi
