异想天开

What's the true meaning of light, Could you tell me why

php正则表达式前后匹配

日期:2015-07-23 18:26:45
  
最后更新日期:2017-10-04 15:28:26
日志后台系统,有个这样的需求:
本wiki的前端编辑是直接使用html中的textarea标记,而编辑中一般会手动敲击回车,在windows下浏览器即输入\r\n,故后台需要将\r\n转化为html换行标记。但是发现了一个这样的问题,若提交的内容有用到表格,使用table标记,编辑时为了美观,里面也会有\r\n,结果导致table标记里面html换行标记,而最终的展现结果会把这个换行标记全部提到表格前面。
[code lang="cpp"]
<table>
<tr><td>试</td>
<td>试</td>
</tr>
</table>
[/code]
那么需要遇到右尖括号时不匹配。故查了下正则表达式用法。

总结一些有用的用法:
1.限制前面有某个符号或没有某个符号
[code lang="cpp"]
零宽度断言 ?<! 断言前面一定没有某个符号,?<= 断言前面一定有某个符号,零宽度的意思,这个符号本身不会被替换,假设匹配a替换为b,而这个a前面必须有个2的a,若用:
$str = '2a';
$str = preg_replace('/(2)a/','b',$str);
[/code]
那么会将2a整体替换,而这里仅仅需要替换a即可。如下正则表达式可以做到,即利用了零宽度前向断言
[code lang="cpp"]
$str = "2a";
$regex = '/(?<=2)a/';
$str = preg_replace($regex,"b",$str);
var_dump($str);
[/code]
[code lang="cpp"]
将这个方向换一下,那么就是反向零宽度断言
$str = "2b";
$regex = '/2(?=b)/';
$str = preg_replace($regex,"s",$str);
var_dump($str);
[/code]