我正在尝试构建一个函数以将var放入字符串中
例如
嗨,我叫{!first_name!}
我的姓氏是{!last_name!},
至 总结一下,我叫{!full_name!}。
我是{!job_title!}。
用我的 函数只需像这样写您的var @ {!code!}
和我的正则表达式
/(@?)(\{\!\s*([^\{\!\!\}]*)\s*\!\})/Uis
我的问题是,如果我有一个以上的字符作为var的开头或结尾,那么[^x]
不能像预期的那样工作
所以我怎么有这样的表达
/(@?)(\{\!\s*(**anything but {! or !}**)\s*\!\})/Uis
或者也许它们是一个更好的方法。
谢谢。
编辑:
这是我的全部功能click here
现在,它可以工作,但是如果我想做这样的事情。
echo dropVars($str, $vars, ['{!','!}']);
它会失败(实际上不会,但是我希望您能理解我的观点)
答案 0 :(得分:1)
尝试:
<?php
$input = "Hi, My name is {!first_name!}
and my family name is {!last_name!},
To sum it up, my name is {!full_name!}.
I am a {!job_title!}.
To use my function just write your vars like this @{!code!}";
preg_match_all('/@?\{\!\s*([^{!}]*)\s*\!\}/mi', $input, $matches);
print_r($matches);
?>
输出:
Array
(
[0] => Array
(
[0] => {!first_name!}
[1] => {!last_name!}
[2] => {!full_name!}
[3] => {!job_title!}
[4] => @{!code!}
)
[1] => Array
(
[0] => first_name
[1] => last_name
[2] => full_name
[3] => job_title
[4] => code
)
)
我将您的正则表达式更改为更简单一些,我只捕获了感叹号和花括号之间的文本部分。我删除了“ U”和“ s”标志,因为我认为不需要它们。我添加了'm'标志,以允许模式匹配多行。
这是另一个示例,它用相应的值替换每个模板变量:
<?php
$input = "Hi, My name is {!first_name!}
and my family name is {!last_name!},
To sum it up, my name is {!full_name!}.
I am a {!job_title!}.
To use my function just write your vars like this @{!code!}";
$replacement_values = [
"first_name" => "Billy",
"last_name" => "Jean",
"full_name" => "Ms. Billy Jean",
"job_title" => "Lover",
"code" => "vars",
];
$input = preg_replace_callback(
'/@?\{\!\s*([^{!}]*)\s*\!\}/mi',
function ($matches){
global $replacement_values;
return $replacement_values[$matches[1]];
},
$input
);
echo $input;
?>
输出:
Hi, My name is Billy
and my family name is Jean,
To sum it up, my name is Ms. Billy Jean.
I am a Lover.
To use my function just write your vars like this vars
答案 1 :(得分:1)
您可以使用
'~(@?)({!\s*((?:(?!{!|!}).)*?)\s*!})~is'
请参见regex demo
详细信息
(@?)
-第1组:可选的@
字符({!\s*((?:(?!{!|!}).)*?)\s*!})
-第2组:
{!
-一个{!
子字符串\s*
-超过0个空格((?:(?!{!|!}).)*?)
-第3组:任何不以{!
或!}
子字符串开头的字符,尽可能少\s*
-超过0个空格!}
-文字子字符串。