PHP 正则表达式常用函数解析:preg_match、ereg_replace与preg_replace
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开发技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













