正则表达式,除了词组a或词组b以外的任何形式,都是较大表达式的一部分

时间:2018-08-08 21:03:36

标签: php regex preg-replace php-7

我正在尝试构建一个函数以将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, ['{!','!}']); 它会失败(实际上不会,但是我希望您能理解我的观点)

2 个答案:

答案 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个空格
    • !}-文字子字符串。