作者foxzgerald (O⊥M)
看板PHP
标题Re: [请益] 看不懂preg_replace函数的使用范例
时间Fri Dec 15 20:44:41 2006
※ 引述《saininniang (sob)》之铭言:
: 下例传回值为 $startDate = 6/19/1969
: <?php
: $patterns = array("/(19|20\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/");
: $replace = array("\\3/\\4/\\1", "$\\1 =");
: print preg_replace($patterns, $replace, "{startDate} = 1969-6-19");
: ?>
: 这是我在google搜preg_replace函数的使用方法
: 但我怎麽看$patterns和$replace也没办法推测出像答案一样的结果
: 我的问题应该是卡在许多符号看不懂其代表的意思
上头的范例有些问题,我将改过的地方以黄色显示:
$patterns = array("/
((19|20)\d{2})-
(\d{1,2})-
(\d{1,2})/", "/^\s*{(\w+)}\s*=/");
$replace = array("\\3/\\4/\\1", "$\\1=");
print preg_replace($patterns, $replace, "{startDate} = 1969-6-19");
x x x
/ 和 / 所夹的部分代表要比对的 pattern
^ 代表从字串开头
\s 代表 [\r\n\t\f\v] 换行、跳行、空白字串.. (感谢 alpe 补正)
* 代表 0 or 1 or any
\w 代表 [a-zA-Z0-9_]
+ 代表 1 or any
\d 代表 0-9 的数字
所以 " {startDate} =" 亦符合 /^\s*{(\w+)}\s*=/
((19|20)\d{2}) 代表会搜寻 19 或 20 开头、并且其後接有两位数字的 pattern
像是: 1983、2006。
\d{2}代表数字需重复两次,换个角度来说,可看成要寻找两位数。
\d{1,2}则是至少出现一次、至多出现两次,如:1、31、99..
\\3/\\4/\\1 则表示将符合的模式的结果,取代为
第三个set/第四个set/第一个set
\\1 表示符合
((19|20)\d{2})
\\2 表示符合
(19|20)
\\3 表示符合
(\d{1,2})
\\4 表示符合
(\d{1,2})
就本例而言: 1969-6-19 变成 6/19/1969
by the way ..
$pattern 与 $replace 为阵列时,是相对应的。
$pattern[0] 将以 $replace[0] 取代;$pattern[1] 将以 $replace[1] 取代
--
「640K ought to be enough for anybody.!」
- Bill Gates -
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.199.121
刚修正了 \\2 .. 应该是 (19|20) 才对
※ 编辑: foxzgerald 来自: 140.119.199.121 (12/15 20:52)
1F:推 alpe:\s = [\r\n\t\f\v] \w=[a-zA-Z0-9_] 12/15 20:50
※ 编辑: foxzgerald 来自: 140.119.199.121 (12/15 20:57)
2F:→ alpe:^ 有 开头 及 非 两种意义 \D = [^\d] \D = 非数字字元 12/15 20:55
3F:推 foxzgerald:恩. 如果 ^ 是放在一个 set 的开头时,如(^abc) 12/15 20:57
4F:→ foxzgerald:我把修正的内容加上去了,感谢 :) 12/15 20:58
5F:推 alpe:这东西落落长..还有3种表示法,php实作2种,没记/不知道是正常 12/15 21:00
6F:→ alpe:php6 以後好像只内间 preg 12/15 21:03
7F:推 superGA:preg表达能力比较强 12/15 22:23
8F:→ superGA:请问alpe第三种是什麽? 有资料可以看吗? 12/15 22:24