php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串. 您所在的位置:网站首页 字符串正则替换怎么操作的 php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串.

php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串.

2024-04-13 07:21| 来源: 网络整理| 查看: 265

### 有一个长期的误解, 如果要分组, 必须用 小括号 和 |, 而不能用 中括号 和 |. `[ab|AB] `表示的不是 匹配 ab或 AB, 而是表示 匹配 a,b, |, A, B 这5个字符中 的任意 一个 字符. 要表示 匹配 ab或 AB, 必须/只能 用 `(ab|AB) `才可以 总之, 使用 字符串函数 还是 使用 正则匹配, 主要看 被处理的 (通常是要被 匹配的或 要被替换的 字符串) 是 确定 的 不变的子串, 还是 不确定的, 如果是确定的, 已知的 那就用 字符串函数, 如果是不确定的, 模糊的 那就用 正则匹配, 当然 正则匹配由于需要 正则引擎的支持, 所以 效率和速度肯定 更慢. ### 要匹配单词的开头或结尾, 匹配 位置的时候, 有两种情形, 如果是在vim中, 使用的 匹配符号是 `\ `, 但是, 如果是在 通用的 , perl正则表达式, php的 preg正则表达式, 则要用 `\b...\b` 这里的 \b 表示的是 boundary 即边界 , 注意他匹配的是 "空格, 标点符号, 回车符等的位置 ", 是位置, 并不包含 空格 等这些 符号本身. 要掌握一个函数,只要掌握其 参数 和返回值就可以了,参数要掌握完整的参数表, 包括那些可选参数。 正则函数的 features:

1.php的正则函数, 分为三种功能, 正则匹配match, 正则替换replace, 正则分割

php的正则函数有两种体系,一种是pcre的pcre_... 一种是 posix体系的 ereg_ 或 eregi_... php的正则函数的参数顺序, 基本上都是相同的,即: funcName( \(patter, [\)replacement], \(string, [\)supplement]) php的正则函数都 有 对应的 非正则函数版本,比如: 匹配的有 strpos, strstr, 字符串替换的有 str_replace, 字符串分解的有 explode, str_split等 是所有的 正则函数(和字符串 操作函数, 包括字符串分割/替换/匹配操作), 都不会对原来的字符串参数造成影响,通常只是对字符串参数的一个拷贝进行操作的。而且 现在的函数 都不允许 传引用 参数了. 而且大多字符串操作 函数, 都可以在 对应的 字符串参数位置 对 数组 进行操作. 第一, 分割字符串,正则分割 分割后的结果,都是放在另外的一个数组中。 分割的方式有两种, 一种是 根据 指定的分割字符来分割,如preg_split, split, explode; 另一种是 根据指定的 "等数" 字符数来分割,如str_split

\(split_result = preg_split(\)patter, \(string [,\)limit] [,$flags]) 与他类似的posix函数 split: \(result = split(\)patter, \(string [,\)limit])

返回结果: 返回分解后的单元,放在 函数外部的 另外的一个 数组变量来接收。 可能的分解情况:

分解模式$patter没有包含原字符串中, 则返回整个字符串的 单元素数组; 分解模式 $patter=//, 即模式字符串中不包含任何东西,则会将原字符串的拷贝 分解为一个一个的字符。并且首尾会多两个空白元素 其他正常分解模式。

\(limit 是指 **最多*分解成(并返回)\)limit 个分解单元, 这个参数最容易被误解,它不是说先把整个字符串分割,然后返回 \(limit个子串,然后剩下的就不要了,实际上不是这样的,正确的意思是: 每次分割总是要把全部字符串分割完并 返回,而是说 **整个**字符串最多分割成\)limit个子串。 如果不确定,要全部返回就用 -1. $flag,说的是返回的子串应该满足些什么条件,最常用的有一个: PREG_SPLIT_NO_EMPTY。

正则表达式的 最小匹配原则

要掌握正则表达式的几个匹配原则:

就是 默认的是 最长/贪婪匹配, 要实现 最小/懒惰匹配, 需要在 .* 的后面 加上? 因为问号是匹配 0次或1次, 所以 最多就是 匹配 一次. 这就是最小匹配原则 , 注意一定是 .* 后面加?, 而不是 在 字符元字符 的后面加上问号,比如 a*? 可能就是错误的??? 也就是最小匹配, 有一个固定的写法,就死 .*? 这里 起最小匹配 作用的是 ? 问号

最早先赢的原则: 最先匹配的字符 具有更高的优先级 the match that begins earliest wins

正向匹配原则, 不管是贪婪匹配, 还是最小匹配, 都是 遵循 从左到右的 匹配原则, 意思是说, 当一个 匹配开始后, 如果在中间 遇到 另一个 开头字符的时候, 他不会认为是另一个 匹配的开始....

==================

第二, 替换字符串, 正则替换

str_replace的原型: $result_after_replace = str_replace( $find, $replacement, $str [, \(count_replace]) 这个函数中, 不允许传引用参数, 最后的那个可选参数是 被替换的次数. 如果\)find $replacement是数组, 则表示 一对一 替换.

[@str_replace("要替换的旧内容", "要取代原内容的新字符", $被替换内容的变量名)] [@str_replace(array('旧1','旧2','旧3'), array('新1','新2','新3'), $被替换内容的变量名)] // 一对一替换 [@str_replace(array('旧1','旧2','旧3'), '新内容', $被替换内容的变量名)] // 一对多替换.

正则替换的函数原型: \(result_after_replace = preg_replace(\)pattern, $replacement, \(string [, [\)limit=-1] [, $replaceCount]]) 跟 str_replace有些类似. 同样的 也可以 处理 数组, $pattern 和 $replace 都可以是数组, 替换法则也是一样, 只是多了一个 \(limit 参数. 而且 在 数组的 正则替换中, 可以使用 后向引用, 在后向引用中, 使用 `\)n来表示 模式中的 部分. 如果\(n` 后面还有其他 数字或字母, 为了区别, 要将 n用大括号括起来. `\){n}abc`等.

同样的:

正则替换函数, 不会 改变原来的 原始 字符串. 下面是体现上述正则匹配几个原则的 首先匹配优先\ 最小匹配 \ 的 一个 好例子:


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有