2011-02-10 3 views
1

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

Например:

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] => go west
[3] =>
[4] =>
[5] => идти на север
[6] =>
[7] =>
)

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

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

ответ

0
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 для получения дополнительной информации.

1
<?php 

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

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

Смежные вопросы