Сохранить разделители при разделении строки - PullRequest
0 голосов
/ 20 мая 2010

Редактировать: ОК, я не могу читать, спасибо полковнику Шрапнелю за помощь. Если кто-то приходит сюда в поисках того же, что нужно ответить ... 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)); для захвата разделителей в качестве подшаблона, но мне не везет.

Ответы [ 3 ]

0 голосов
/ 20 мая 2010

Ваш комментарий звучит так, как будто вы нашли соответствующий флаг, но ваше регулярное выражение немного отклонено, поэтому я все равно добавлю это:

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] => 
)
0 голосов
/ 20 мая 2010

Вы также можете разделить пробел после ., !, ? или !?. Но это можно использовать только в том случае, если вы можете гарантировать наличие пробела после такого символа.

Вы можете сделать это, сопоставив , но с положительным результатом: (<=\.|!?|?|!): это делает регулярное выражение

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

И затем, вам нужно проверить, заканчивается ли сопоставляемая строка с !?: если так, подстрока последних двух. Если нет, вам придется вставить последний символ.

0 голосов
/ 20 мая 2010

Просто добавьте 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 => "",
);
...