我正在为车把做一个助手,并想解析如下内容:
"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
)