博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则替换
阅读量:5936 次
发布时间:2019-06-19

本文共 2258 字,大约阅读时间需要 7 分钟。

hot3.png

在subject中搜索pattern模式的匹配项并替换为replacement。如果指定了limit,则仅替换limit个匹配,如果省略limit或者其值为 -1,则所有的匹配项都会被替换。

replacement可以包含\\n形式或(自 PHP 4.0.4 起)$n形式的逆向引用,首选使用后者。每个此种引用将被替换为与第n个被捕获的括号内的子模式所匹配的文本。n可以从 0 到 99,其中\\0或$0指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。

对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的\\1符号来表示逆向引用。举例说\\11,将会使 preg_replace() 搞不清楚是想要一个\\1的逆向引用后面跟着一个数字1还是一个\\11的逆向引用。本例中的解决方法是使用\${1}1。这会形成一个隔离的$1逆向引用,而使另一个1只是单纯的文字。

例子 1. 逆向引用后面紧接着数字的用法

<?php
$string = "April 15, 2003";
$pattern = "/(\w+) (\d+), (\d+)/i";
$replacement = "\${1}1,\$3";
print preg_replace($pattern, $replacement, $string);
/* Output
   ======
April1,2003
*/
?>

如果搜索到匹配项,则会返回被替换后的subject,否则返回原来不变的subject。

preg_replace() 的每个参数(除了limit)都可以是一个数组。如果pattern和replacement都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个pattern将被哪个replacement来替换,应该在调用 preg_replace() 之前用 对数组进行排序。

例子 2. 在 preg_replace() 中使用索引数组

<?php
$string = "The quick brown fox jumped over the lazy dog.";
$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";
$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";
print preg_replace($patterns, $replacements, $string);
/* Output
   ======
The bear black slow jumped over the lazy dog.
*/
/* By ksorting patterns and replacements,
   we should get what we wanted. */
ksort($patterns);
ksort($replacements);
print preg_replace($patterns, $replacements, $string);
/* Output
   ======
The slow black bear jumped over the lazy dog.
*/
?>

如果subject是个数组,则会对subject中的每个项目执行搜索和替换,并返回一个数组。

如果pattern和replacement都是数组,则 preg_replace() 会依次从中分别取出值来对subject进行搜索和替换。如果replacement中的值比pattern中的少,则用空字符串作为余下的替换值。如果pattern是数组而replacement是字符串,则对pattern中的每个值都用此字符串作为替换值。反过来则没有意义了。

/e修正符使 preg_replace() 将replacement参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保replacement构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

例子 3. 替换数个值

<?php
$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
                   "/^\s*{(\w+)}\s*=/");
$replace = array ("\\3/\\4/\\1\\2", "$\\1 =");
print preg_replace ($patterns, $replace, "{startDate} = 1999-5-27");
?>

本例将输出:

$startDate = 5/27/1999

例子 4. 使用 /e 修正符

<?php
preg_replace ("/(<\/?)(\w+)([^>]*>)/e",
              "'\\1'.strtoupper('\\2').'\\3'",
              $html_body);
?>

这将使输入字符串中的所有 HTML 标记变成大写。

转载于:https://my.oschina.net/shunshun/blog/142198

你可能感兴趣的文章
WindowsForm 增 删 查 改
查看>>
为页内的tab添加的iframe添加加载动画过渡效果
查看>>
P1067 多项式输出 (模拟)
查看>>
javap使用
查看>>
php gettext
查看>>
Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份
查看>>
练习方法--刻意练习
查看>>
多进程
查看>>
Java方式 MySQL数据库连接
查看>>
MATLAB2012 licence失效解决方法
查看>>
Android ListView初始化将实例化多少个item
查看>>
[LeetCode] Factorial Trailing Zeroes 阶乘末尾0
查看>>
消除字号标签<h1><h2><h3>的自动换行
查看>>
关于ListView的一些不常用到的属性
查看>>
php 对象数组互转
查看>>
文本超过长度后隐藏,显示省略号
查看>>
netstat常见参数
查看>>
wpf Loading动画 AkeemLoading
查看>>
Ubuntu 里面 apt-get 三个有关更新的命令的区别
查看>>
POJ 1019, Number Sequence
查看>>