簡體   English   中英

正則表達式Preg_match_all匹配所有模式

[英]Regex Preg_match_all match all pattern

這是我的擔憂,我有一個琴弦,我需要兩三個地提取字法。

$str = "abcdef"應該返回array('ab', 'bc', 'cd', 'de', 'ef') 我想使用preg_match_all而不是loops 這是我正在使用的模式。

$str = "abcdef";
preg_match_all('/[\w]{2}/', $str);

問題是,它返回Array('ab', 'cd', 'ef') 它錯過了'bc''de'

如果要提取一定數量的單詞,我也會遇到同樣的問題

$str = "ab cd ef gh ij";
preg_match_all('/([\w]+ ){2}/', $str); // returns array('ab cd', 'ef gh'), I'm also missing the     last part

我想念什么? 還是使用preg_match_all根本不可能做到這一點?

對於第一個問題,您想要做的是匹配重疊的string ,這需要零寬度 (不消耗文本)的環顧四周來抓住字符:

/(?=(\w{2}))/

上面的正則表達式將在第一個捕獲組中捕獲匹配項。

演示

對於第二個問題,看來您也想要重疊的字符串。 使用相同的技巧:

/(?=(\b\w+ \w+\b))/

請注意,已添加\\b以檢查單詞的邊界。 由於該匹配不消耗文本,因此將在下一個索引(位於第一個單詞的中間)而不是第二個單詞的末尾嘗試下一個匹配。 我們不想從單詞的中間捕獲,因此我們需要邊界檢查。

請注意, \\b的定義基於\\w ,因此,如果您更改單詞的定義,則需要使用相應的字符集來模擬單詞邊界,並且要先行模擬。

演示

如果您需要非正則表達式解決方案,請嘗試此...

<?php

$str = "abcdef";
$len = strlen($str);

$arr = array();
for($count = 0; $count < ($len - 1); $count++)
{
    $arr[] = $str[$count].$str[$count+1];
}

print_r($arr);

?>

請參閱鍵盤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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