PHP:正则表达式

在 PHP 中,正则表达式是一种强大的工具,用于处理字符串的模式匹配和搜索替换操作。

一、基本语法

1. 定界符:

PHP 中的正则表达式通常用定界符包裹,常见的定界符是斜线(/)。例如:/$pattern$/。

2. 模式:

模式是正则表达式的核心部分,用于描述要匹配的字符串的特征。例如:/[a-z]+/表示匹配一个或多个小写字母。

3. 修饰符:

修饰符可以放在定界符的后面,用于改变正则表达式的行为。常见的修饰符有i(不区分大小写)、m(多行匹配)、s(使点号(.)匹配包括换行符在内的所有字符)等。例如:/$pattern$/i表示不区分大小写的匹配。

二、匹配操作

1. 函数:preg_match(pattern, subject, matches, flags, offset)

preg_match()函数是PHP中的一个强大的正则表达式匹配函数。它用于在字符串中搜索匹配给定正则表达式模式的内容。这个函数主要用于检查一个字符串是否包含与特定模式相匹配的部分,并且可以获取匹配的内容。

pattern:必需参数,是一个字符串,表示要匹配的正则表达式模式。例如,/[a-z]+/用于匹配一个或多个小写字母。

subject:必需参数,是一个字符串,表示要在其中进行搜索的目标文本。

matches:可选参数,是一个数组,用于存储匹配的结果。如果匹配成功,$matches[0]将包含整个匹配的文本,$matches[1]等(如果有子模式匹配)将包含子模式匹配的内容。

flags:可选参数,用于修改preg_match()函数的行为。例如,PREG_OFFSET_CAPTURE标志可以让匹配结果包含匹配文本在原始字符串中的偏移量。

offset:可选参数,用于指定从目标字符串的哪个位置开始搜索,默认是从字符串的开头(位置0)开始。

用于在字符串中进行一次正则表达式匹配。如果匹配成功,返回 1;如果匹配失败,返回 0。

// 例1
$string = "Hello, world!";
$pattern = "/world/";
if (preg_match($pattern, $string)) {
    echo "Match found.";
} else {
    echo "No match found.";
}
// 例2
// 假设要从一个URL中提取域名部分,可以使用子模式匹配:
$subject = "https://www.example.com/page";
$pattern = "/https?:\/\/([a-zA-Z0-9\-\.]+)/";
// 这里的正则表达式模式https?:\/\/([a-zA-Z0-9\-\.]+)中,
// ([a-zA-Z0-9\-\.]+)是一个子模式,用于捕获URL中的域名部分。
// $matches[1]将存储这个子模式匹配的内容,即域名。
if (preg_match($pattern, $subject, $matches)) {
    echo "域名是:". $matches[1];
} else {
    echo "未找到匹配的URL";
}
// 例3
$subject = "abc123def";
$pattern = "/\d+/";
if (preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE)) {
    echo "匹配成功,匹配的数字是:". $matches[0][0]. ",位置是:". $matches[0][1];
    // 当使用PREG_OFFSET_CAPTURE标志时,$matches数组的结构会发生变化。
    // $matches[0][0]仍然包含匹配的文本,而$matches[0][1]包含匹配文本
    // 在原始字符串中的偏移量(起始位置)。
} else {
    echo "未找到匹配的数字";
}

2. preg_match_all()函数:

用于在字符串中进行全局正则表达式匹配,返回所有匹配的结果。

$string = "apple, banana, cherry";
$pattern = "/[a-z]+/";
preg_match_all($pattern, $string, $matches);
print_r($matches);

三、替换操作

1. preg_replace()函数:

用于在字符串中进行正则表达式替换操作。可以将匹配到的部分替换为指定的字符串。

$string = "Hello, world!";
$pattern = "/world/";
$replacement = "PHP";
$newString = preg_replace($pattern, $replacement, $string);
echo $newString;

四、分割操作

1. preg_split()函数:

用于根据正则表达式将字符串分割成数组。

$string = "apple,banana,cherry";
$pattern = "/,/";
$parts = preg_split($pattern, $string);
print_r($parts);

五、高级用法

1. 捕获组:

可以在正则表达式中使用括号来定义捕获组,以便在匹配成功后提取特定的部分。

$string = "Hello, John Doe!";
$pattern = "/Hello, (\w+) (\w+)/";
preg_match($pattern, $string, $matches);
echo "First name: ".$matches[1]."<br>";
echo "Last name: ".$matches[2]."<br>";

2. 反向引用:

在正则表达式中,可以使用反向引用来引用之前捕获的组。例如,\1表示引用第一个捕获组,\2表示引用第二个捕获组,以此类推。

$string = "abab";
$pattern = "/(.)\1/";
preg_match($pattern, $string, $matches);
echo "Match found: ".$matches[0];

3. 零宽断言:

零宽断言用于在不实际匹配字符的情况下进行条件判断。例如,正向预查((?=pattern))和负向预查((?!pattern))。

$string = "hello world";
$pattern = "/w(?=o)/";
preg_match($pattern, $string, $matches);
echo "Match found: ".$matches[0];

正则表达式是一种非常强大但也相对复杂的工具,需要一定的学习和实践才能熟练掌握。在使用正则表达式时,要注意性能问题,避免编写过于复杂的正则表达式,以免影响程序的执行效率。同时,要确保正则表达式的正确性,可以通过测试工具和逐步调试来验证正则表达式的效果。

PHP编程语言基础