解析后面跟着变量名的双引号字符串的正则表达式


What regular expression to parse a double quoted string followed by variable names?

我正在为车把做一个助手,并想解析如下内容:

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

RegEx演示

那应该是。。。

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

解释

贪婪地匹配以"结尾的最长前缀。由于这一部分被锚定在测试字符串的开头,正则表达式的这一部分将永远不会匹配。相反,第二部分获取所有以空格分隔的变量名。

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
)