2010-05-20 2 views
0

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

+2

Почему бы не прочитать страницу руководства по функциям? может быть, может быть ответ? хотя для обнаружения разделителей в качестве подшаблона вы можете использовать preg_match_all. но раскол - это самое лучшее. просто сделайте привычку ссылаться на страницу руководства сначала –

+1

Erp. Просто вернусь через страницу, и теперь я учу оптиков для набора очков:/Я ослеп. Спасибо, что заставило меня снова взглянуть на это: P – JoeC

+0

Обратите внимание, что вы используете класс символов. '[\! \ \? \ \. \ \! \?]' означает ony символов '!', '|', '?' и '.'. Вероятно, вы хотите: '(! | \? | \. |! \?)'. Или с классом символов: '([?.] |! \ ??)'. – Gumbo

ответ

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] => 
) 
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 => "", 
); 
0

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

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

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

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