Разбейте строку с повторяющимся узором, сохранив разделитель - PullRequest
1 голос
/ 10 февраля 2011

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

Например:

go north.pick up item.go west...go north..

Чего можно достичь: «иди на север, возьми предмет, иди три раза на запад, иди дважды на север».Однако при использовании preg_split я просто не могу получить желаемый вывод.

Все, что у меня есть до сих пор, это:

$temp = 'go north.pick up item.go west...go north..';
preg_split('/\.)/', $temp);

, что дает:

Массив
(
[0] => перейти на север
[1] => подобрать предмет
[2] => перейти на запад
[3] =>
[4]=>
[5] => идти на север
[6] =>
[7] =>
)

Это явно неверно в двух случаях - нетвозвращаются точки и дополнительная команда в конце.Точки должны быть возвращены, чтобы наш синтаксический анализатор мог решить, что пользователь хочет повторить свою последнюю команду.

Использование PREG_SPLIT_DELIM_CAPTURE не дает никаких результатов, несмотря на использование (\.) в качестве регулярного выражения.

Ответы [ 2 ]

1 голос
/ 10 февраля 2011
<?php

$temp = 'go north.pick up item.go west...go north..';
preg_match_all('/[^.]*\./', $temp, $r);
var_dump($r);

См. http://ideone.com/a7o7v для демонстрации вывода.

0 голосов
/ 10 февраля 2011
preg_match_all('~([^.]+)(\.+)~', $input, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    // $match[1] is what to do and $match[2] contains the dots.
    echo 'Do ', $match[1], ' ', strlen($match[2]), ' times', "\n";
}

Подробнее см. preg_match_all.

...