PHP 中正则表达式的使用

本文优先发表于个人博客

PHP 字符串操作相关函数

PHP 中 PCRE 库和 POSIX 库的对比:
提示: 我们更推荐使用 后者PCRE 库,因为它效率更高。

POSIX PCRE(推荐) 阐述
ereg_replace() preg_replace() 替换
ereg() preg_match() 匹配
eregi_replace() preg_replace() 替换
eregi() preg_match() 匹配
split() preg_split() 分割
spliti() preg_split() 分割
spl_regcase() 无对等函数(可用模式修饰符i代替) 产生用于不区分大小的匹配的正则表达式

RCRE 函数的分隔符

  • RCRE 需要由分隔符闭合包裹。
  • 分隔符可以使用任意 非字母数字非反斜线非空白字符,例如:
    • /foo bar/ 分隔符为 /
    • #^[0-9]$# 分隔符为 #
    • +php+ 分隔符为 +
    • %[a-zA-Z0-9_-]% 分隔符为 %
    • 当然我们推荐统一使用 /

PCRE的主要函数

  • preg_grep($pattern, $array) ------ 返回与正则表达式匹配的数组单元。
  • preg_match($pattern, $string) ------ 执行一个正则表达式匹配
  • preg_match_all() ------ 执行一个全局正则表达式匹配
  • preg_filter ------ 执行一个正则表达式搜索 和 替换
  • preg_replace ------ 执行一个正则表达式的搜索和替换
  • preg_replace_callback ------ 执行搜索并且使用一个回调进行替换
  • preg_split ------ 通过一个正则表达式分割字符串
  • preg_quoto ------ 转义正则表达式字符
  • preg_last_error ------ 返回最后一个 PCRE 正则执行产生的错误代码

实例

1. preg_grep() 匹配数组

返回与正则表达式匹配的数组单元

<?php
$array = ['Linux RedHat9.0', 'Apache2.2.9', 'MySQL5.0.51', 'PHP5.2.6', 'LAMP', '100'];
// 返回与正则匹配的数组元素
$version = preg_grep("/^[a-zA-Z]+(\d|\.)+$/", $array);
print_r($version);

结果输出:

Array
(
    [1] => Apache2.2.9
    [2] => MySQL5.0.51
    [3] => PHP5.2.6
)

2.1 preg_replace() 文本替换

普通替换用法:

<?php
// 正则
$pattern = "/<[\/\!]*?[^<>]*?>/is";

// 待匹配文本内容
$text = "这个文本中有 <b>粗体</b> 和 <u>带有下划线</u>以及 <i>斜体</i>还有 <font color='red' size='7'>带有颜色和字体大小</font>的标记";

// 将所有 HTML 标记替换为空。
echo preg_replace($pattern, "", $text);
echo PHP_EOL . "<br/>" . PHP_EOL;
// 通过第4个参数传入数字2,替换前两个匹配到的 HTML 标记
echo preg_replace($pattern, "", $text, 2);

结果输出:


这个文本中有 粗体 和 带有下划线以及 斜体还有 带有颜色和字体大小的标记
<br/>
这个文本中有 粗体 和 <u>带有下划线</u>以及 <i>斜体</i>还有 <font color='red' size='7'>带有颜色和字体大小</font>的标记

2.2 preg_replace() 文本替换 - 反向引用

包含反向引用:

<?php
// 日期格式的正则表达式
$pattern = "/(\d{2})\/(\d{2})\/(\d{4})/";

$text = "今年国庆节放假日期为 10/01/2019 到 10/07/2019 共7天。";

echo preg_replace($pattern, "\\3 - \\1 - \\2", $text);

echo PHP_EOL . "<br/>" . PHP_EOL;

echo preg_replace($pattern, "\${3} - \${1} - \${2}", $text);

结果输出:


今年国庆节放假日期为 2019 - 10 - 01 到 2019 - 10 - 07 共7天。
<br/>
今年国庆节放假日期为 2019 - 10 - 01 到 2019 - 10 - 07 共7天。

3 preg_split() 分割字符串

<?php
// 按正则所匹配的分隔符进行分割字符串
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);

// 将字符串分割成 单个字符
$chars = preg_split("//", 'lamp', -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);

// 将字符串分割为匹配项及其偏移量
$chars = preg_split("/ /", 'hypertext language, programming', -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
本作品采用《CC 协议》,转载必须注明作者和本文链接
老哥以后是要做 CTO 的人,这些技术怎么能不会呢?
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!