PHP正则表达式,标记在字符串中多次出现

时间:2014-09-15 14:23:09

标签: php regex

我的目标是加粗标记{{}}之间的内容。问题是如果标签出现多次,它就不会按照我想要的方式工作。

$string1 = "hello my {{name}} is bo.";
$string2 = "hello my {{name}} is bo. Or {{not}}";
$startPoint = '{{';
$endPoint = '}}';
$result = preg_replace('/('.preg_quote($startPoint).')(.*)('.preg_quote($endPoint).')/si', '<b>$2</b>', $string);

使用string1的结果:(应该如此)

你好我的名称是bo。

使用string2的结果:(不是我想要的)

你好我的名字}}是博。或{{not

我觉得我有一些愚蠢的错过,只是不确定是什么。所有的帮助将不胜感激。

编辑:谢谢! (。*?)作为魅力,如果你写答案,我会把它标记为已解决。谢谢!

1 个答案:

答案 0 :(得分:1)

你为什么不尝试这个?

$pattern = "~{{([^}{]*)}}~";
$replacement = "<b>$1</b>";
echo preg_replace($pattern, $replacement, $string);

.*会做一场贪婪的比赛。也就是说它会占用第一个{{和最后一个}}大括号之间的所有内容。要进行尽可能短的匹配,您需要在?之后添加量词*。由于模式中存在捕获组,即(.*),所有匹配的字符都存储在第一个组中。这就是为什么你将字符串name}} is bo. Or {{not加入到组1中。

模式说明:

  • {{匹配两个开口花括号。
  • ([^}{]*)匹配并捕获任何字符数零次或多次但不包括}{

  • }}匹配两个结束花括号。