2013-03-14 87 views
1

以下是我的問題, 我有一個字符串,我需要兩個兩個提取chraracters。Regex Preg_match_all匹配所有模式

$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

回答

4

對於第一個問題,你想要做的是比賽重疊串,這就需要零寬度(不消耗文本)環視搶字符:

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

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

DEMO

對於第二個問題,看來你也想重疊的字符串。使用同樣的伎倆:

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

注意\b添加到檢字的邊界。由於匹配不會消耗文本,下一個匹配將嘗試在下一個索引(位於第一個詞的中間),而不是在第二個詞的末尾。我們不想從一個詞的中間抓取,所以我們需要進行邊界檢查。

請注意,\b的定義基於\w,所以如果您更改過某個單詞的定義,則需要使用相應的字符集來預先模擬字邊界,並使用相應的字符集進行後縮。

DEMO

+0

非常感謝它,它完美的作品。對第二個問題的任何建議? – LostSEO 2013-03-14 05:33:53

+0

第二個問題也解決了,再次感謝 – LostSEO 2013-03-14 05:36:41

1

在情況下,如果你需要一個非正則表達式解決方案,試試這個...

<?php 

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

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

print_r($arr); 

?> 

Codepad