插件窝 干货文章 php正则表达式有哪些

php正则表达式有哪些

匹配 表达式 正则 pattern 266    来源:    2025-03-16

PHP 中的正则表达式(Regular Expressions)是一种强大的工具,用于字符串的匹配、查找、替换等操作。PHP 支持两种主要的正则表达式语法:PCRE(Perl Compatible Regular Expressions)POSIX 扩展正则表达式。不过,POSIX 扩展正则表达式在 PHP 5.3.0 中已被弃用,并在 PHP 7.0.0 中移除,因此现在主要使用 PCRE。

以下是 PHP 中常用的正则表达式语法和函数:

1. 正则表达式语法

PCRE 正则表达式语法非常丰富,以下是一些常用的元字符和语法:

  • .:匹配除换行符以外的任意单个字符。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • *:匹配前面的子表达式零次或多次。
  • +:匹配前面的子表达式一次或多次。
  • ?:匹配前面的子表达式零次或一次。
  • {n}:匹配前面的子表达式恰好 n 次。
  • {n,}:匹配前面的子表达式至少 n 次。
  • {n,m}:匹配前面的子表达式至少 n 次,但不超过 m 次。
  • [...]:字符类,匹配方括号中的任意一个字符。
  • [^...]:否定字符类,匹配不在方括号中的任意一个字符。
  • \d:匹配一个数字字符,等价于 [0-9]
  • \D:匹配一个非数字字符,等价于 [^0-9]
  • \w:匹配一个单词字符(字母、数字、下划线),等价于 [a-zA-Z0-9_]
  • \W:匹配一个非单词字符,等价于 [^a-zA-Z0-9_]
  • \s:匹配一个空白字符(空格、制表符、换行符等)。
  • \S:匹配一个非空白字符。
  • \b:匹配一个单词边界。
  • \B:匹配一个非单词边界。
  • |:或操作符,匹配左边或右边的表达式。
  • ():捕获组,用于捕获匹配的子字符串。
  • (?:...):非捕获组,匹配但不捕获子字符串。
  • (?=...):正向预查,匹配后面跟着指定模式的位置。
  • (?!...):负向预查,匹配后面不跟着指定模式的位置。

2. 常用的正则表达式函数

PHP 提供了多个函数来处理正则表达式,以下是一些常用的函数:

  • preg_match():执行一个正则表达式匹配,返回匹配的次数(0 或 1)。

    $pattern = '/\d+/';
    $subject = 'There are 123 apples.';
    if (preg_match($pattern, $subject, $matches)) {
      echo "Match found: " . $matches[0];
    }
    
  • preg_match_all():执行全局正则表达式匹配,返回所有匹配的结果。

    $pattern = '/\d+/';
    $subject = 'There are 123 apples and 456 oranges.';
    if (preg_match_all($pattern, $subject, $matches)) {
      print_r($matches[0]);
    }
    
  • preg_replace():执行正则表达式的搜索和替换。

    $pattern = '/\d+/';
    $replacement = 'X';
    $subject = 'There are 123 apples and 456 oranges.';
    $result = preg_replace($pattern, $replacement, $subject);
    echo $result;
    
  • preg_split():通过正则表达式分割字符串。

    $pattern = '/\s+/';
    $subject = 'Split this string by spaces';
    $result = preg_split($pattern, $subject);
    print_r($result);
    
  • preg_grep():返回与模式匹配的数组元素。

    $pattern = '/\d+/';
    $array = ['apple', '123', 'orange', '456'];
    $result = preg_grep($pattern, $array);
    print_r($result);
    
  • preg_quote():转义正则表达式字符。

    $string = 'This is a string with special characters: . * + ? ^ $ { } ( ) [ ] | \ /';
    $quoted = preg_quote($string);
    echo $quoted;
    

3. 正则表达式修饰符

在正则表达式的末尾可以添加修饰符来改变匹配的行为:

  • i:不区分大小写匹配。
  • m:多行模式,^$ 匹配每一行的开始和结束。
  • s:单行模式,. 匹配包括换行符在内的所有字符。
  • u:启用 UTF-8 模式。
  • x:忽略空白字符和注释。

例如:

$pattern = '/hello/i';  // 不区分大小写匹配 "hello"

4. 示例

以下是一些常见的正则表达式示例:

  • 匹配电子邮件地址

    $pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
    $email = 'example@example.com';
    if (preg_match($pattern, $email)) {
      echo "Valid email address.";
    }
    
  • 匹配 URL

    $pattern = '/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/';
    $url = 'https://www.example.com';
    if (preg_match($pattern, $url)) {
      echo "Valid URL.";
    }
    
  • 匹配日期格式(YYYY-MM-DD)

    $pattern = '/^\d{4}-\d{2}-\d{2}$/';
    $date = '2023-10-05';
    if (preg_match($pattern, $date)) {
      echo "Valid date format.";
    }
    

5. 注意事项

  • 性能:复杂的正则表达式可能会导致性能问题,尤其是在处理大量数据时。
  • 安全性:在处理用户输入时,确保正则表达式不会导致安全问题(如正则表达式注入)。
  • 调试:正则表达式可能难以调试,可以使用在线工具(如 regex101.com)来测试和调试正则表达式。

通过掌握这些正则表达式的基本语法和函数,你可以在 PHP 中高效地处理字符串匹配和替换任务。