0

編集:わかりました、助けてくれた榴散弾大佐に感謝します。誰かがここに来て同じことを探しに来たら... print_r(preg_split('/([\!|\?|\.|\!\?])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

一連の区切り文字で文字列を分割し、分割後も区切り文字の位置と文字を保持する方法はありますか?

たとえば、! ? . !? これを回す区切り文字を使用します。

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';

これに

array('Hello', '.', 'A question', '?', 'How strange', '!', 'Maybe even surreal', '!?', 'Who knows', '.');

現在、区切り文字をサブパターンとしてキャプチャするために使用しようとしていますprint_r(preg_split('/([\!|\?|\.|\!\?])/', $string));が、あまり運がありません。

4

3 に答える 3

0

PREG_SPLIT_DELIM_CAPTUREをpreg_split関数に追加するだけです。

$str = 'Hello. A question? How strange!';
$var = preg_split('/([!?.])/', $str, 0, PREG_SPLIT_DELIM_CAPTURE);
$var = array(
    0 => "Hello",
    1 => ".",
    2 => " A question",
    3 => "?",
    4 => " How strange",
    5 => "!",
    6 => "",
);
于 2010-05-20T17:49:08.197 に答える
0

コメントは関連するフラグを見つけたように聞こえますが、正規表現が少しずれていたので、とにかくこれを追加します。

preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE);

これにより、最初の文字列の後のすべての文字列の先頭にスペースが残ることに注意してください。したがって、おそらくそれらをすべて実行することをお勧めしますtrim()

結果:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';
print_r(preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

Array
(
    [0] => Hello
    [1] => .
    [2] =>  A question
    [3] => ?
    [4] =>  How strange
    [5] => !
    [6] =>  Maybe even surreal
    [7] => !?
    [8] =>  Who knows
    [9] => .
    [10] => 
)
于 2010-05-20T17:49:17.650 に答える
0

、、、またはの後.にスペースを分割することもできます。ただし、これは、そのような文字の後にスペースがあることを保証できる場合にのみ使用できます。!?!?

これを行うには、を一致させますが、前向きな振り返りを使用します(<=\.|!?|?|!)::これにより正規表現が作成されます

'/(?<=\.|\?|!) /'

次に、一致する文字列が!?:で終わるかどうかを確認する必要があります。そうである場合は、最後の2つを部分文字列にします。そうでない場合は、最後の文字を部分文字列にする必要があります。

于 2010-05-20T17:56:43.197 に答える