您好!欢迎访问家园网-www.jy.wang!

家园网

正则表达式函数讲解

网络 作者:本站 点击:

讲一下下面的php代码:

    /** 写入at表 **/
    $reg = "/@([^@\s]+)/";                  //正则匹配,得到@的用户
    $match = array();
    preg_match_all($reg,$content,$match);   //得到@用户数组
    $users_array = array_unique($match[1]); //去掉重复用户名


代码功能解析

1. 正则表达式匹配

$reg = "/@([^@\s]+)/";
  • 作用‌:匹配文本中所有@用户名格式的内容

  • 正则解释:

    • @:匹配字面量@符号

    • ([^@\s]+):捕获组,匹配非@符号和非空白字符的连续序列(即用户名)

    • 示例:匹配@张三中的张三

2. 执行匹配操作

preg_match_all($reg, $content, $match);
  • 功能‌:在$content字符串中查找所有匹配@用户名的片段

  • 结果存储‌:

    • $match[0]:完整匹配的字符串(如@张三

    • $match[1]:捕获的用户名数组(如[张三, 李四]

3. 去重处理

$users_array = array_unique($match[1]);
  • 作用‌:移除重复的用户名

  • 示例‌:若原数组为['张三', '李四', '张三'],处理后变为['张三', '李四']

4. 典型应用场景

  1. 微博/评论系统‌:识别被@的用户,用于通知或权限验证

  2. 数据清洗‌:提取用户提及信息进行统计分析

  3. 社交互动‌:实现@好友功能的基础处理

5. 安全与优化建议

  • 输入验证‌:应对$content进行HTML实体解码(如html_entity_decode())后再匹配

  • 用户名过滤‌:可添加正则限制(如/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/)防止注入

  • 性能优化‌:对长文本可考虑preg_match()配合循环分批处理

这段代码是社交平台中@功能的核心预处理逻辑,通过正则提取和去重,为后续的用户通知或权限检查提供准确的数据基础。

上面的这句preg_match_all($reg, $content, $match);详细讲一下

函数参数解析

  1. $reg

    • 类型:字符串格式的正则表达式模式

    • 作用:定义匹配规则,示例中/@([^@\s]+)/匹配以@开头且不含空白符的连续字符

  2. $content

    • 类型:待搜索的原始字符串

    • 处理逻辑:函数会扫描整个字符串,寻找所有符合$reg模式的子串

  3. $match

    • $match[0]:保存所有完整匹配项(如@张三

    • $match[1]:保存第一个捕获组的内容(如张三

    • 更高维数组对应更多捕获组

    • 类型:引用传递的数组变量

    • 输出结构:

执行特性

  • 全局匹配‌:不同于preg_match()仅匹配第一次出现,该函数会遍历整个字符串获取所有匹配结果

  • 返回值‌:返回完整匹配次数(可能为0),错误时返回false

典型应用场景

  1. 数据提取‌:如从文本中批量提取URL、邮箱等结构化数据

  2. 内容分析‌:统计社交文本中的提及用户(如示例中的@用户名匹配)

  3. 文本清洗‌:配合preg_replace()实现批量替换操作

注意事项

  • 性能影响‌:复杂正则或长文本可能导致性能下降,建议限制匹配范围

  • UTF-8支持‌:需添加u修饰符(如/pattern/u)以正确处理多字节字符

该函数是实现文本模式匹配的核心工具,特别适合需要批量提取数据的场景

上面的这句preg_match_all($reg, $content, $match);详细讲一下。如果这里的$reg为张三,那么会输出什么

preg_match_all() 函数详解

函数原型

int preg_match_all(string $pattern, string $subject, array &$matches)

参数说明

  1. $reg(正则模式)

    • 当值为"张三"时,会直接匹配文本中的"张三"字面量(非正则模式)

    • 此时相当于精确字符串搜索

  2. $content(输入文本)

    • 示例文本:"张三今天@张三 遇到了@李四"

  3. $match(输出数组)

    • 结构说明:

    $match = [
        0 => ["张三", "张三"],  // 完整匹配结果
        1 => ["张三", "张三"]   // 捕获组结果(无捕获组时与0相同)
    ]


特殊场景测试

$reg = "张三";
$content = "张三今天@张三 遇到了@李四";
preg_match_all($reg, $content, $match);
print_r($match);

输出结果

Array
(
    [0] => Array
        (
            [0] => 张三
            [1] => 张三
        )
)

关键结论

  1. $reg为普通字符串时,函数退化为‌全文字符串搜索

  2. 会返回所有匹配位置的完整字符串(存储在$match[0]

  3. 由于没有定义捕获组,$match[1]不会产生额外数据

  4. 此场景下array_unique($match[0])可直接去重重复匹配项

上面的这句preg_match_all($reg, $content, $match);详细讲一下。如果这里的$reg为@张三,那么会输出什么

preg_match_all() 函数详解($reg = "@张三" 的情况)

核心行为

当正则模式为字面量字符串"@张三"时:

  1. 函数会‌精确匹配‌文本中所有@张三的连续出现

  2. 由于没有定义正则捕获组(),输出数组结构会简化

示例演示

$reg = "@张三";
$content = "用户@张三 正在和@张三@李四 讨论问题";
preg_match_all($reg, $content, $match);
print_r($match);

输出结果

Array
(
    [0] => Array
        (
            [0] => @张三
            [1] => @张三
        )
)

关键结论

  1. 匹配模式‌:退化为精确字符串搜索,非正则特性

  2. 输出结构‌:

    • $match[0] 包含所有匹配到的完整字符串(含@符号)

    • 不会生成$match[1]等捕获组数组(因无()定义捕获组)

  3. 典型用途‌:适合精确统计特定字符串出现次数

对比原始正则/@([^@\s]+)/的区别

特性原始正则$reg = "@张三"
匹配范围所有@开头的用户名仅匹配"@张三"
输出维度二维数组(含捕获组)一维数组
结果去重必要性需要(可能重复匹配)自动去重(精确匹配)

注:实际开发中建议保持正则表达式写法,确保功能扩展性

preg_match_all的preg是个缩略词吧?从词源角度分析一下这个php函数




























preg是PHP中Perl兼容正则表达式(Perl Compatible Regular Expressions)函数的前缀缩写,其中"p"代表Perl,"reg"代表正则表达式(regular expressions)

这一命名规范源自PHP对Perl语言正则表达式功能的兼容性实现,具体分析如下:

  1. 词源构成‌:

    • "p"明确指向Perl语言,表明这类函数采用了Perl风格的正则语法规则

    • "reg"是regular expression的缩写,标识其属于正则表达式处理功能

    • 组合后的"preg"作为统一前缀,用于区分POSIX风格的正则函数(如ereg_)

  2. 技术背景‌:

    • PCRE库(Perl Compatible Regular Expressions)是PHP实现这类函数的基础,其设计目标就是完全复现Perl5的正则特性

    • 相比POSIX正则,PCRE提供更丰富的模式修饰符和更高效的匹配算法

  3. 函数命名体系‌:

    • preg_match_all中的"all"表示全局匹配,与preg_match(单次匹配)形成互补

    • 同类函数如preg_replacepreg_split等均遵循相同命名逻辑

这种命名方式既体现了技术渊源(Perl兼容),又通过前缀体系保持了函数命名的可读性和一致性

Perl语言又是什么?Perl语言为什么用perl命名?又是代表了什么意思



























  1. Perl语言的定义与特性

Perl(Practical Extraction and Report Language)是一种高级、通用、解释型的动态编程语言,最初由Larry Wall于1987年设计,主要用于文本处理任务

其核心特性包括:

  • 文本处理能力‌:内置强大的正则表达式支持,擅长文件解析、数据转换等操作

  • 多范式支持‌:同时支持过程式、面向对象和函数式编程

  • 跨平台性‌:可在超过100种计算机平台上运行

  • 灵活性‌:遵循"There's More Than One Way To Do It"(TIMTOWTDI)哲学,允许同一问题多种实现方式

命名来源与含义

  1. 词源构成‌:

    • "Perl"最初是"Practical Extraction and Report Language"的首字母缩写,直译为"实用报表提取语言",直接反映其设计初衷——高效处理文本和生成报表

    • 全称中的"Practical"强调其实用性,"Extraction"和"Report"突出核心文本处理功能

  2. 命名演变‌:

    • 语言官方文档中,大写的"Perl"指语言本身,小写的"perl"指解释器程序

    • 社区后来将"Perl"重新解释为"Pathologically Eclectic Rubbish Lister"(病态折衷的垃圾整理器),以幽默方式体现其语言特性

  3. 技术关联‌:

    • 名称中的"Perl"与"pearl"(珍珠)谐音,但为避免与已有商标冲突,最终缩减为5个字母

    • 命名体现了对C、sed、awk等语言特性的继承与融合

标签: