Я делаю помощник для руля и хочу разобрать что-то вроде этого:
"hello \"great\" friend" var1 var2
У меня есть выражение работает для вещей без двойных кавычек внутри строки:
(?<=")[^"]*(?=")|(\w+)
Спасибо за любую помощь!
Использование руля {{#gettext "Hello \"friend\" %s %s" var1 var2}}
где #gettext
мой пользовательский помощник, который потребляет строку из первого "
до }}
ПОЯСНЕНИЯ
Я не хочу \
показать при рендеринге.
Ожидаемый результат должен быть:
// Array of matches via preg_match_all
Hello "great" friend
var1
var2
Я сделал другое решение.
Это немного более гибко:
/"((?:\\"|[^"])+)"| (\w+)/g
Это соответствует всему внутри кавычек или снаружи с пробелом раньше.
Вы можете проверить на этот ссылка на него в действии.
Ты можешь использовать:
$str = '"hello \"great\" friend" var1 var2';
$re = '/"(.+?)(?<!\\\\)"\h+(\w+)\h+(\w+)/';
preg_match($re, $str, $matches);
$matches[1] = stripslashes($matches[1]);
array_shift($matches);
print_r($matches);
Выход:
Array
(
[0] => hello "great" friend
[1] => var1
[2] => var2
)
Это было бы что-то вроде …
(^".*")|([ ]+([^ "]+))
объяснение
Жадно соответствует самому длинному префиксу, оканчивающемуся на "
, Так как эта часть привязана к началу тестовой строки, эта часть регулярного выражения больше никогда не будет соответствовать. Вместо этого вторая часть получает все разделенные пробелами имена переменных.
RegexDemo Вот
Встраивание в код
Переформатирование вывода.
Regex и код работают с несколькими парами экранированных кавычек и произвольным числом переменных.
function postprocess ( &$item, $key ) {
if ($key == 0) {
$item = str_replace('\\"', '"', substr($item, 1, strlen($item)-2));
}
else {
$item = substr($item, 1);
}
}
$str = '"hello \"great\" friend of \"mine\"" var1 var2 var3 var4';
$re = '/(^"(.*)")|([ ]+([^ "]+))/';
preg_match_all($re, $str, $matches);
$matches = $matches[0]; # Array of complete matches
array_walk ($matches, 'postprocess');
print_r($matches);
Этот код был протестирован на writecodeonline.com.
Выход
Array
(
[0] => hello "great" friend of mine
[1] => var1
[2] => var2
[3] => var3
[4] => var4
)