簡體   English   中英

PHP Regexp(PCRE) - 查找所有子串的集合2

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM