0

注: 最近この質問をしましたが、探しているソリューションは当初考えていたよりも高度であることがわかりました。

preg_split を使用して、これをどのように分割しますか。区切り文字の前の文字列が異なることに注意してください。

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green gape";

文字列の配列を区切り文字として使用し、それらを結果に含めたいと考えています。区切り文字: [りんご、ぶどう、さくらんぼ]

私の望ましい出力は次のとおりです。

Array("big red apple", "one purple grape", "some stuff then green apple", "yatta yatta red cherry", "green grape");

これが私がもともと持っていたものです:

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green gape";
$matches = preg_split('(apple|grape|cherry)', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($matches);

これは次のように出力します: Array ( [0] => 大きな赤 [1] => 1 つの紫 [2] => いくつかのもの、次に緑 [3] => yatta yatta red [4] => green gape )

区切り記号なし。

4

2 に答える 2

3

入力文字列の最後の単語のタイプミスを修正すると、(考えられる 1 つの) パターンは次のようになります。

~(?<=apple|grape|cherry)\s*~

これは、後読みを使用してから、次の空白 (存在する場合) で分割していますしたがって、文字列の最後でも機能します。

完全な例:

<?php
/**
 * preg_split using PREG_SPLIT_DELIM_CAPTURE with an array of delims
 * @link http://stackoverflow.com/a/16304338/2261774
 */

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green grape";

var_dump(
    preg_split("~(?<=apple|grape|cherry)\s*~", $string, -1, PREG_SPLIT_NO_EMPTY)
);

実際に見てください。

ご覧のとおり、PREG_SPLIT_DELIM_CAPTURE分割したスペースを削除したいので、ここでは使用していません。代わりに、PREG_SPLIT_NO_EMPTYフラグを使用して、文字列の末尾に (空の) 分割を取得しないようにします。

于 2013-04-30T16:07:53.120 に答える
0

少し単純ですが、結果は同じです。

$string = "big red apple one purple grape some stuff then green apple yatta yatta red cherry green grape";
$re='/\S.*?\s(?:apple|grape|cherry)/';
preg_match_all($re,$string,$m);
var_dump($m[0]);
于 2017-08-22T04:52:50.123 に答える