1

これが私の懸念です。文字列があり、文字を2つずつ抽出する必要があります。

$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

2 に答える 2

4

最初の問題では、重複する文字列を一致させる必要があります。これには、文字を取得するために幅がゼロ(テキストを消費しない)のルックアラウンドが必要です。

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

上記の正規表現は、最初のキャプチャグループで一致をキャプチャします。

デモ

2番目の問題については、文字列をオーバーラップさせたいようです。同じトリックを使用する:

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

\b単語の境界をチェックするために追加されていることに注意してください。一致はテキストを消費しないため、次の一致は2番目の単語の終わりではなく、次のインデックス(最初の単語の途中)で試行されます。単語の途中からキャプチャしたくないので、境界チェックが必要です。

\bの定義はに基づいて\wいるため、単語の定義を変更する場合は、対応する文字セットを使用して先読みと後読みで単語の境界をエミュレートする必要があることに注意してください。

デモ

于 2013-03-14T05:26:04.460 に答える
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);

?>

コードパッドを参照してください。

于 2013-03-14T05:28:35.453 に答える