首頁 > 後端開發 > php教程 > 正则表达式,需用到 负向零宽断言

正则表达式,需用到 负向零宽断言

WBOY
發布: 2016-06-13 12:19:35
原創
1037 人瀏覽過

求一个正则表达式,需用到 负向零宽断言
内容

<a>123456</a><br />7890234<br /><a>123<br />789</a>
登入後複製

我只想匹配到 不在 里面的内容,即需要匹配到
7890234<br /><a>123<br />789</a>
登入後複製

以下是我自己写的正则,但是没成功,望指教
(?!<a.*?)\d+(?!.*<\/a>)
登入後複製

------解决思路----------------------
没有解决你的问题,但是在解决的过程中遇到了一个奇怪的问题

$str = <<<a>123456</a><br />7890234<br /><a>123<br />789</a>
EOF;
// 手册里面有一个 (?!pattern) 负向预查 应该就是 "负向零宽断言" 的意思吧
preg_match_all('/(?<=)\d+(?=<\/a>)/',$str,$m);// [0] => 123456
preg_match_all('/(?)\d+(?!<\/a>)/',$str,$t1);
/*
相邻的数字没有获取到
[0] => 2345
[1] => 7890234
[2] => 23
[3] => 78
单独测试 123
也是只能获取到 23
*/

$str_space = <<
123456
7890234
123
789

EOF;
preg_match_all('/(?)\d+(?!<\/a>)/',$str_space,$t2);
/*
而在 相邻的数字加一个空格就可以了
[0] => 123456
[1] => 7890234
[2] => 123
[3] => 789
*/
echo "
";
print_r($m);
print_r($t1);
print_r($t2);
echo "
登入後複製
";

------解决思路----------------------
只匹配到 123456 是很容易的
你把它删了,剩下的不就是你要的了吗?
$s =<<< TXT
<a>123456</a><br />7890234<br /><a>123<br />789</a>
TXT;

$p = '#\d+[\r\n]+#';
preg_match_all("/[^\r\n]+/", preg_replace($p, '', $s), $m);
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/。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板