正則表達式的零寬向前、向后匹配


正則中向前匹配和向后匹配非常強大好用。

這里的向前意思是文本的右邊,向后是文本的左邊(正則引擎匹配按照左->右)。

向前和向后匹配是非獲取匹配,即匹配結果不包括這個內容。匹配過程中不消耗字符,不占字符。

來來,舉個栗子。

<?php

$a = '2abc3abc';

// 匹配右邊是abc的2  
$re1 = preg_match('/2(?=abc)/', $a, $match);

// 匹配的是2,沒有abc
var_dump($match);// array(1) { [0]=> string(1) "2" }

 

<?php

$a = '2abc3abc';

$re = preg_match('/2(?=abc)3/', $a, $match);

// 匹配失敗 因為零寬匹配是不消耗字符
var_dump($re);// int(0)

// 這樣才能匹配上 注意不消耗字符的含義
// $re = preg_match('/2(?=abc)abc3/', $a, $match);
//var_dump($re);// int(1)

 

 

一些代碼示例: 

// 向右匹配
// (?=)  匹配
// (?!)  不匹配
$str = "abcx1 abcy2 abcz3";

// 匹配右邊是y的abc
$a = preg_replace('/abc(?=y)/', '0', $str);// abcx1 0y2 abcz3

// 匹配右邊不是y的abc
$b = preg_replace('/abc(?!y)/', '1', $str);// 1x1 abcy2 1z3

// ===================================

// 向左匹配 注意有小於號
// (?<=)  匹配
// (?<!)  不匹配

$str = "1xabc 2abc 3zabc";

// 匹配左邊一個字符是數字的abc
$a = preg_replace('/(?<=\d)abc/', '0', $str);// 1xabc 20 3zabc

// 匹配左邊一個字符不是數字的abc
$b = preg_replace('/(?<!\d)abc/', '1', $str);// 1x1 2abc 3z1


// ===================================

// 同時向前向后匹配

$str = 'XXX13188887777YYY123ZZZ';// 找到一個1開頭的11位數字,並且前后都不是數字的,在數字前加一個 mobile:

// $1是刨除掉向前匹配的括號 注意
$re = preg_replace('/(?<=[^0-9])(1\d{10})(?=[^0-9])/', ' mobile:$1 ', $str);// XXX mobile:13188887777 YYY123ZZZ

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM