Я работаю над приложением, которое получает текст в качестве входных данных и дает диаграммы последовательности в качестве выходных данных, что-то вроде Диаграммы веб-последовательности. Итак, для ввода по умолчанию, как Алиса говорит Привет Бобу, ввод:
Alice -> Bob: Hi
Пользователи могут вносить любые вклады. Варианты для вышеупомянутой линии:
Alice -> Bob : Hi
Alice -> Bob :Hi
Alice -> Bob: Hi
Alice -> Bob:Hi
Alice ->Bob : Hi
Alice ->Bob :Hi
Alice ->Bob: Hi
Alice ->Bob:Hi
Alice-> Bob : Hi
Alice-> Bob :Hi
Alice-> Bob: Hi
Alice-> Bob:Hi
Alice->Bob : Hi
Alice->Bob :Hi
Alice->Bob: Hi
Alice->Bob:Hi
Другие варианты сообщений включают в себя следующие стрелки:
-
--
->
-->
->>
-->>
Даже если я хочу разделить вход на основе ->
и :
, это сложно, так как эти сообщения могут приходить в любом порядке. Итак, если я даю что-то вроде:
Alice --> Bob: Hello
Bob -> Alice: See you!
Сначала я ограничил пользователей обязательным выделением места вокруг стрелок. И после этого счет будет равен 3, а затем третий элемент массива будет разделен с помощью :
, Это достигается с помощью приведенного ниже кода:
$userInput = array_map('trim', explode("\r\n", trim($input)));
foreach ($userInput as $line) {
$line = array_filter(array_map('trim', explode(" ", str_replace(array(":", ": "), " ", $line), 4)));
Я заменяю :
с пробелом и разделить строку до четырех символов с пробелом в качестве разделителя. Правильно ли я поступаю, так как это не сработает, если указанные пробелы такие же, как указано выше, и когда все типы стрелок указаны пользователем, этот метод не работает. Пожалуйста, ведите меня.
Попробуйте использовать регулярные выражения и preg_match (http://www.php.net/preg_match). Это сделает вашу жизнь намного проще.
Шаблон регулярного выражения:
/(\w+)\s*\-+>{1,2}\s*(\w+)\s*:\s*(\w+)/i
Сломать:
(\w+) <- Match and return 1 or more characters
\s* <- Match 0 or more white space characters
(\-+>{1,2}) <- Match and return 1 or more "-" characters followed by 1 or 2 ">" characters
Источник:
<?php
foreach ($userInput as $line) {
$matches = array();
preg_match('/(\w+)\s*(\-+>{1,2})\s*(\w+)\s*:\s*(\w+)/i', $line, $matches);
echo $matches[1] . "\n"; // Alive
echo $matches[2] . "\n"; // --> or -> or --->
echo $matches[3] . "\n"; // Bob
echo $matches[4] . "\n"; // Hi
}
Других решений пока нет …