PHP正则表达式典型应用三例

在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>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
 </tr>
</table>
<table width="200" border="1" id="gp2">
 <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
 </tr>
</table>
<table width="200" border="1" id="gp3">
 <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</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>&nbsp;</td>里面的&nbs;又该如何呢?
还记得第一个例子吗?没错,用反向预查。例:
(?<=<td>).*</td>
       这样只是去除了前面的<td>,后面的</td>去还存在。这个时候我们要用正向预查,当正则匹配到</td>之前的时候就停下来。这样:
       (?<=<td>).*(?=</td>)
 
把程序写完整:
       $result = preg_replace('/(?<=<td>).*(?=<//td>)/', '', $subject);
 
推荐大家使用RegexBuddy工具对正则进行书写和验证。支持语言最多,功能最强大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值