[英]PHP Regexp (PCRE) - Find a set of all substrings 2
例如,有一個源字符串:
__aaXXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZvv..
我怎樣才能找到所有:aaXX * YY * ZZ
__ aaXX cc YY eeXX_ ZZ kkYYmmXX_ZZnnXXooYYuuXX_ZZvv ..
__ aaXX cc YY eeXX_ZZkkYYmmXX_ ZZ nnXXooYYuuXX_ZZvv ..
__ aaXX cc YY eeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ ZZ vv ..
__ aaXX ccYYeeXX_ZZkk YY mmXX_ ZZ nnXXooYYuuXX_ZZvv ..
__ aaXX ccYYeeXX_ZZkk YY mmXX_ZZnnXXooYYuuXX_ ZZ vv ..
__ aaXX ccYYeeXX_ZZkkYYmmXX_ZZnnXXoo YY uuXX_ ZZ vv ..
問題是PHP preg不支持(?<= exp)lookbehind斷言中的?+ *(可變長度)(僅允許固定長度{N})。
所以需要解決方案而不使用具有可變長度的lookbehind斷言。
謝謝!
你需要循環。 首先查找__aaXX
然后是下一個YY
,然后是__aaXX
,然后是第二個YY
等。在正則表達式中,這意味着您首先查找__aaXX(.*?YY){1}
,然后__aaXX(.*?YY){2}
(你能在那里看到一個循環變量嗎?)等等,直到模式失敗。 當您尋找ZZ
時,第二部分也是如此。
這個腳本有效:
<?php // test.php 20110311_1200
$data = '__aaXXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZvv..';
$all_matches = array();
$yy_match = true; // Get past first for test condition.
for ($yy_cnt = 1; $yy_match; ++$yy_cnt) {
$yy_match = false; // Assume failure for this yy_cnt.
$zz_match = true; // Get past first for test condition.
for ($zz_cnt = 1; $zz_match; ++$zz_cnt) {
$zz_match = false; // Assume failure for this zz_cnt.
// Assemble new regex with new $yy_cnt and $zz_cnt.
$re = "/ # Match all combinations of XX..YY..ZZ.
(aaXX) # $1: Prefix X.
(?: # Group to find YY[yy_cnt].
(?:(?!YY).)* # Zero or more non-YY.
(YY) # $2: next YY.
){{$yy_cnt}} # yy_cnt.
(?: # Group to find ZZ[zz_cnt].
(?:(?!ZZ).)* # Zero or more non-ZZ.
(ZZ) # $3 next ZZ.
){{$zz_cnt}} # $zz_cnt.
/x";
if (preg_match($re, $data, $matches, PREG_OFFSET_CAPTURE)) {
$zz_match = true;
$yy_match = true;
$all_matches[] = $matches;
printf("Match found. \$yy_cnt = %d, \$zz_cnt = %d\n",
$yy_cnt, $zz_cnt);
}
}
}
print_r($all_matches);
?>
這個模式怎么樣: # aaXX(.*) YY (.*) ZZ .*#
?
從你的突出顯示它不完全清楚你的結果應該是什么樣的......我添加了空格,因為你在突出顯示中有它們,但是不清楚你是否將它們放在你的源中......
編輯
我想我不理解你想要得到什么,但另一件要看的是preg_match_all,如果你的YY ZZ部分重復......像#_aaXX((.*?)YY(.*?)ZZ)+#
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.