Можете ли вы разделить строку в PHP с помощью регулярного выражения, но легко получить совпадающую строку, которая разделяет строку? - PullRequest
1 голос
/ 08 июня 2009

Моя строка выглядит так

Февраль 2009

бла бла

март 2009

ду да бла лбла

сентябрь 2009

Итак, я написал это регулярное выражение, чтобы разделить его на месяцы (я думаю, именно это я и хочу сделать в первую очередь)

$regex = '/(.*)\s(\d){4}/i';

Это соответствует им идеально, за исключением того, что выбрасывает фактическую строку, на которую они были разбиты ... т.е. я хочу эту информацию (как в феврале 2009, марте 2009 и т. Д.)

Я пытался обойти с флагами preg_split(), но не смог получить то, что хотел.

Должен ли я использовать другой подход? Легко ли разделить текст с помощью регулярных выражений, но оставить текст, который на самом деле был там?

Если подумать, я мог бы использовать здесь preg_match_all () ... Надеюсь, я просто не ответил на свой вопрос в ответе - я все равно отправлю сообщение, чтобы узнать, что думает сообщество. .

Спасибо

Ответы [ 3 ]

3 голосов
/ 08 июня 2009

Поместите разделительную строку в свою собственную группу захвата. Итак, учитывая ваш пример,

$regex = '/(.*)\s(\d){4}/i';

с несколькими модификациями становится:

$regex = '/(.+?)(\s)(\d{4})/i';

Если ваш массив совпадений называется «$ match», $ match [0] будет содержать все совпадение, $ совпадений [1] за месяц, $ совпадений [2] разделительную строку и $ совпадений [3] год .

2 голосов
/ 08 июня 2009

4-й вариант preg_split - флаги:

http://www.php.net/preg-split

PREG_SPLIT_DELIM_CAPTURE Если это флаг установлен, выражение в скобках в шаблоне разделителя будет захвачен и возвращен.

$a = preg_split('/(.*\s\d{4})/i', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($a);

отпечатки

Array
(
    [0] => 

    [1] => February 2009
    [2] => 
bla bla

    [3] => March 2009
    [4] => 
doo daa bla lbla

    [5] => Septemer 2009
    [6] => 

)

Так что это довольно близко.

0 голосов
/ 08 июня 2009

похоже, что работает даже без не жадного модификатора '?'

preg_match('/(.*)\s(\d{4})/', "Month 2009", $a);

(интересно, почему (. *) Должно соответствовать всей строке, не так ли?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...