我對正則運算式很陌生,并且堅持以下,我嘗試用它preg_match_all來計算hello after world的數量。
如果我使用"world". (hello),它會在最后一個hello 中計數;"world".*?(hello)停在第一個hello,都給一個計數。
blah blah blah
hello
blah blah blah
class="world"
blah blah blah
hello
blah blah
hello
blah blah blah
hello
blah blah blah
我期待3作為計數,因為不應該計算hello之前world。
uj5u.com熱心網友回復:
使用簡單正則運算式的另一種選擇:
if(preg_match('/"world".*/s', $str, $out)) {
echo preg_match_all('/\bhello\b/', $out[0]);
}
在 tio.run 上查看演示
uj5u.com熱心網友回復:
您可以preg_match_all在此處使用單個呼叫:
$text = "blah blah blah\nhello\nblah blah blah\nclass=\"world\" \nblah blah blah\nhello \nblah blah\nhello\nblah blah blah\nhello\nblah blah blah";
echo preg_match_all('~(?:\G(?!^)|\bworld\b).*?\K\bhello\b~s', $text);
請參閱正則運算式演示和PHP 演示。詳情:
(?:\G(?!^)|\bworld\b)- 前一個匹配的結尾(\G(?!^)是否進行此檢查:\G匹配字串的開頭或前一個匹配位置的結尾,因此我們需要排除字串位置的開頭,這是通過(?!^)負前瞻完成的)或整個單詞world.*?- 任何零個或多個字符,盡可能少\K- 丟棄到目前為止匹配的所有文本\bhello\b- 一個完整的詞hello。
注意:如果您不需要字邊界檢查,您可以\b從模式中洗掉。
如果hello和world是用戶定義的模式,則必須preg_quote在模式中使用它們:
$start = "world";
$find = "hello";
$text = "blah blah blah\nhello\nblah blah blah\nclass=\"world\" \nblah blah blah\nhello \nblah blah\nhello\nblah blah blah\nhello\nblah blah blah";
echo preg_match_all('~(?:\G(?!^)|' . preg_quote($start, '~') . '\b).*?\K' . preg_quote($find, '~') . '~s', $text);
uj5u.com熱心網友回復:
一種方法可能是首先去除字串的前導部分,直到并包括第一次出現world。然后preg_match_all像您已經在做的那樣呼叫并獲取 的出現次數hello。
$input = "blah blah blah
hello
blah blah blah
class=\"world\"
blah blah blah
hello
blah blah
hello
blah blah blah
hello
blah blah blah";
$input = preg_replace("/^.*?\bworld/", "", $input);
preg_match_all("/\bhello\b/", $input, $matches);
echo sizeof($matches[0]); // 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348205.html
