在php实际应用中我们经常遇到一些对字符串里特定的字符进行修改。
例一:
字符串“$inputArray[0] = Array("a", "1" ,"/[test/]");”里的下标0要修改成特定的数字,如何把这个0换成正确的数字呢
我们注意到在下标0前面有一组在字符串中唯一的组合“$inputArray[”
正则先是这样:
/$inputArray/[
数字并没有匹配进去,加进去后变成这样:
/$inputArray/[/d+
这样全都匹配出来了,没关系我们加一个反向预查,像这样:
(?<=/$inputArray/[)/d+
这才是我们想到要,把代码写全:
$result = preg_replace('/(?<=//$inputArray//[)//d+/', '', $subject);
例二:
在一个HTML文件里,我们不同的表格都有一个唯一的ID,如果我们不想让客户看到特定ID的表格,这时该怎么做呢?
HTML源码:
<table width="200" border="1" id="gp1">
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
<table width="200" border="1" id="gp2">
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
<table width="200" border="1" id="gp3">
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
如我们只想匹配出ID为gp2的表格。嗯,好办,都是以<table 开关 再加上特定的ID号,最后以</table>结尾,你可能会这样写:
<table.*gp2.*>[^{]*</table>
试一下,一直匹配到最后的</table>去了,这并不是我们想要的。
这是因为默认运行在贪婪模式下,在这种模式下正则会尽可能的查找符合表达式的字符我们加一个?号,在表达式只查找最少的次数,也就是非贪婪模式。
你可能会加成这样:
<table.*gp2.*>[^{]*</table>?
出错了吧,注意看中间的[^{]*,表示零到多个非{字符,这也就包括了</table>。
这里的{只是为了方便,如果你的字符串是可能会有{出现,请换成另一个特殊的,机乎不会出现的字符。
改成这样可以了:
<table.*gp2.*>[^{]*?</table>
把程序写完整:
$result = preg_replace('/<table.*gp1.*>[^{]*?<//table>/', '', $subject);
例三:
以上例HTML源码来看,我们只想得某二个标记之间的字符,这时我们该怎么办呢?
如我们只匹配<td> </td>里面的&nbs;又该如何呢?
还记得第一个例子吗?没错,用反向预查。例:
(?<=<td>).*</td>
这样只是去除了前面的<td>,后面的</td>去还存在。这个时候我们要用正向预查,当正则匹配到</td>之前的时候就停下来。这样:
(?<=<td>).*(?=</td>)
把程序写完整:
$result = preg_replace('/(?<=<td>).*(?=<//td>)/', '', $subject);
推荐大家使用RegexBuddy工具对正则进行书写和验证。支持语言最多,功能最强大。