PHP 正则表达式常用函数解析:preg_match、ereg_replace与preg_replace

Owen
Owen
发布时间:2026-10-14| 7人浏览过
原创

PHP 提供了多种处理正则表达式的函数,其中 Perl 兼容的正则表达式(PCRE)函数如 preg_match 和 preg_replace 是主流选择,而旧版的 POSIX 扩展函数 ereg 和 ereg_replace 虽然功能相似但执行效率较低且已被标记为过时。本文将解析这些函数的用法、参数及典型应用场景。

PCRE 匹配函数:preg_match()

preg_match 函数在指定的字符串中搜索与给定正则表达式模式相匹配的内容。它是目前 PHP 中最推荐的匹配方式。

函数原型:

int preg_match (string $pattern, string $subject [, array &$matches])
  • $pattern:正则表达式模式字符串,通常需包裹在分隔符中(如 /)。
  • $subject:需要被搜索的目标字符串。
  • $matches:可选。如果提供,匹配结果将存入该数组中。$matches[0] 包含完整匹配项,$matches[1] 包含第一个括号内的捕获组,依此类推。

该函数仅执行一次匹配,成功返回 1,失败返回 0。

第 1 步:使用 preg_match 进行时间与日期匹配

目的:从动态生成的日志或文本中提取标准格式的时间信息。

入口与代码示例:

<?php 
// 假设当前系统时间为 "Current date and time is 2006-08-17 01:25 pm"
$content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together."; 

// 方法一:匹配完整的时间格式
if (preg_match ("/\d{4}-\d{2}-\d{2} \d{2}:\d{2} [ap]m/", $content, $m)) 
{ 
  echo "匹配的时间是:" .$m[0]. "\n";
} 

// 方法二:分别提取日期和时间(利用分组捕获)
if (preg_match("/(\d{10}) (\d{5} [ap]m)/", $content, $m)) 
{ 
  echo "当前日期是:" .$m[1]. "\n";
  echo "当前时间是:" .$m[2]. "\n";
} 
?>

若输入时间包含“2006-08-17 01:25 pm”,上述代码将输出对应的日期和时间片段。

POSIX 系列函数:ereg() 与 eregi_replace()

ereg() 及其忽略大小写的变体 eregi() 属于 POSIX 扩展库函数。它们的功能与 preg_match 类似,但直接接受纯正则字符串(不需要分界符),并返回布尔值。

注意:由于性能原因,POSIX 正则函数比 PCRE 函数慢得多,且在 PHP 7.0 中已被移除。在现代开发中应优先使用 preg_* 系列函数。

示例:文件名安全过滤(历史用法参考)

过去常用于简单验证输入是否符合特定规则:

<?php 
$filename = $_GET['file']; 
// 检查是否包含非法字符(如 / 或 . 开头)
if (!ereg('^[^./][^/]*$', $filename)) 
{ 
  die('这不是一个合法的文件名!'); 
} 
?>

正则替换函数:preg_replace() 详解

preg_replace 是功能强大的替换函数,支持数组操作和替换次数限制。

函数原型:

mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])
  • $pattern:可以是单个字符串或字符串数组,指定要查找的模式。
  • $replacement:替换后的内容,也可以是数组,需与 $pattern 对应。
  • $subject:目标字符串或字符串数组。
  • $limit:可选。设置最大替换次数,默认为 -1(无限次)。

第 1 步:批量数组替换

适用于模板引擎填充或批量数据清洗场景:

<?php 
$string = "Name: {Name}<br>/nEmail: {Email}<br>/nAddress: {Address}"; 

$patterns = array(
  "/{Address}/",
  "/{Name}/",
  "/{Email}/"
);

$replacements = array (
  "No.5, Wilson St., New York, U.S.A",
  "Thomas Ching",
  "tom@emailaddress.com",
); 

print preg_replace($patterns, $replacements, $string);
?>

第 2 步:代码清理应用

使用 preg_replace 可以像之前的 ereg_replace 一样清理 HTML 源代码,但性能更佳:

<?php 
$lines = file('source.php'); // 读取文件到数组
for($i=0; $i<count($lines); $i++) {
  // 去除行末注释及多余空白
  $lines[$i] = preg_replace('/(//|#).*?$/', '', $lines[$i]); 
  $lines[$i] = preg_replace('/[ \r\n\t]+$/', '', $lines[$i]);
}
echo join("\n", $lines); 
?>

高级功能:e 修正符的使用风险

早期的 preg_replace 支持 e 修饰符(即 /e),允许将替换字符串作为 PHP 代码执行。例如:

// 将所有 HTML 标签转为小写
$html_body = "<H1>TEST</H1>...";
echo preg_replace("/<(\/?)((w+)([^>]*))>/e",
                 "'<$1'.strtolower('$2').'>'",
                 $html_body); 

重要提醒:由于 e 修正符存在严重的注入漏洞风险,该特性已在 PHP 7.0 中被完全移除,不应再使用。如需动态计算替换结果,请使用 preg_replace_callback 替代。

简要总结

在日常 PHP 开发中,应始终首选 preg_match 和 preg_replace 进行处理。它们基于 Perl 兼容正则表达式语法,不仅执行速度快,而且功能全面。对于简单的非正则字符串替换,直接使用 str_replace 以获得最佳性能;而对于复杂的校验和格式化需求,掌握 preg_replace 的数组参数传递技巧能极大简化代码逻辑。

以上就是PHP 正则表达式常用函数的详细内容,更多关于PHP开发技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。