正则表达式 - 只找到字符串的范围

时间:2018-05-16 06:28:20

标签: php regex

我有这个字符串:

{category:-}{product}-{rewrite:/}{/:controller}

我想查找来自{ to :: to }的所有子字符串并将其删除,如下所示:

{category}{product}-{rewrite}{controller}

我的正则表达式是/:.*}/g,但是它会先选择:来持续},当我替换它时,请给它!:

{category}

2 个答案:

答案 0 :(得分:0)

这是一个简单明了的方法:

$input = "{category:-}{product}-{rewrite:/}{/:controller}";
echo preg_replace("/:[^a-zA-Z0-9]*(?=\})|(?<=\{)[^a-zA-Z0-9]*:/", "", $input);

{category}{product}-{rewrite}{controller}

Demo

我使用的正则表达式模式的目标如下:

  • 冒号,后面跟着非字母数字字符,然后关闭}括号
  • 冒号前面只有非字母数字字符,前面打开{括号

答案 1 :(得分:0)

以下代码可以帮助您:

$string = '{category:-}{product}-{rewrite:/}{/:controller}'; 
$string = preg_replace("/{([^{]:)*(\w*)(:[^}]*)*}/", '{$2}', $string); 
echo $string;

如果您想尝试多种变体,请this guide