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

Я делаю помощник для руля и хочу разобрать что-то вроде этого:

"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

0

Решение

Я сделал другое решение.

Это немного более гибко:

/"((?:\\"|[^"])+)"| (\w+)/g

Это соответствует всему внутри кавычек или снаружи с пробелом раньше.

Вы можете проверить на этот ссылка на него в действии.

1

Другие решения

Ты можешь использовать:

$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
)

RegEx Demo

0

Это было бы что-то вроде …

(^".*")|([ ]+([^ "]+))

объяснение

Жадно соответствует самому длинному префиксу, оканчивающемуся на ", Так как эта часть привязана к началу тестовой строки, эта часть регулярного выражения больше никогда не будет соответствовать. Вместо этого вторая часть получает все разделенные пробелами имена переменных.

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
)
0
По вопросам рекламы [email protected]