始终使用正则表达式在两个字符之间添加空格

时间:2018-04-26 14:51:41

标签: php regex

对于那些正则表达式专家,你可以帮我调整这个正则表达式,总是在两个匹配的字符之间添加一个空格。

我的尝试是解决Vue.js对于从服务器端传递的数据的插值安全性问题(Vue.js将尝试评估两个花括号之间的任何内容)。目标是:

  1. 始终确保两个花括号之间的空白
  2. 不添加额外的空格。
  3. 我的str_replace解决方案(仅实现目标#1)

    str_replace(
        ['{',  '}',  '{',  '}',  '{',  '}' ],
        ['{ ', '} ', '{ ', '} ', '{ ', '} '],
        $value
    );
    

    到目前为止我尝试过的正则表达式:

    preg_replace('/({|}|{|}|{|})(\S)/', '$1 $2', $value);
    

    因此它会检查任何匹配的字符,后面跟空格并在两个字符之间插入空格。

    正则表达式在大多数情况下都有效,但在有三个或更多匹配字符时会失败。

    Ex:{{{返回{ {{,但预期输出为{ { {

1 个答案:

答案 0 :(得分:3)

它没有按预期工作,因为前两个{字符与regex匹配,替换完成然后继续搜索3 rd 字符输入字符串

您可以通过将第二个括号转换为forward assertion来解决此问题。这样,第一个匹配时不会消耗第二个},下一个搜索将以输入字符串的第二个字符开头:

preg_replace('/({|}|{|}|{|})(?=\S)/', '$1 ', $value);

这种方式只有一个捕获组,$2始终为空,替换字符串中不再需要它。

查看实际操作:https://3v4l.org/CaMHS。添加了+++个标记,表明第三个{regex不匹配,并且没有替换。