求一个正则表达式,需用到 负向零宽断言
内容
<a>123456</a><br>7890234<br><a>123<br>789</a>
7890234<br><a>123<br>789</a>
以下是我自己写的正则,但是没成功,望指教
(?!<a.*?)\d+(?!.*<\/a>)
------解决思路----------------------
没有解决你的问题,但是在解决的过程中遇到了一个奇怪的问题
<br>$str = <<<EOF<br><a>123456</a><br>7890234<br><a>123<br>789</a><br>EOF;<br>// 手册里面有一个 (?!pattern) 负向预查 应该就是 "负向零宽断言" 的意思吧<br>preg_match_all('/(?<=<a>)\d+(?=<\/a>)/',$str,$m);// [0] => 123456<br>preg_match_all('/(?<!<a>)\d+(?!<\/a>)/',$str,$t1);<br>/*<br>与 <a> 或 </a> 相邻的数字没有获取到<br>[0] => 2345<br>[1] => 7890234<br>[2] => 23<br>[3] => 78<br>单独测试 <a>123<br>也是只能获取到 23<br>*/<br><br>$str_space = <<<EOF<br><a> 123456 </a><br>7890234<br><a> 123<br>789 </a><br>EOF;<br>preg_match_all('/(?<!<a>)\d+(?!<\/a>)/',$str_space,$t2);<br>/*<br>而在 <a> 或 </a> 相邻的数字加一个空格就可以了<br>[0] => 123456<br>[1] => 7890234<br>[2] => 123<br>[3] => 789<br>*/<br>echo "<pre class="brush:php;toolbar:false;">";<br>print_r($m);<br>print_r($t1);<br>print_r($t2);<br>echo "";------解决思路----------------------
只匹配到 123456 是很容易的
你把它删了,剩下的不就是你要的了吗?
$s =<<< TXT<br><a>123456</a><br>7890234<br><a>123<br>789</a><br>TXT;<br><br>$p = '#<a>\d+</a>[\r\n]+#';<br>preg_match_all("/[^\r\n]+/", preg_replace($p, '', $s), $m);<br>print_r($m);Array<br>(<br> [0] => Array<br> (<br> [0] => 7890234<br> [1] => <a>123<br> [2] => 789</a><br> )<br><br>)<br><br>
必须说明的是:php 的正则表达式并没有完全实现现代正则表达式的全部功能,有关断言的实现是残缺的
如果你是想学习一下正则表达式,那么就应在 C#、Java 环境中进行
如果你是需要实际使用,那么就应开动脑筋,变通的使用
正则表达式的支持是由 PCRE(Perl Compatible Regular Expression)库提供的,这是个开放源代码的软件,作者为 Philip Hazel,版权属于英国剑桥大学。可于以下地址获得:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/。










