我的目标是加粗标记{{}}之间的内容。问题是如果标签出现多次,它就不会按照我想要的方式工作。
$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
我觉得我有一些愚蠢的错过,只是不确定是什么。所有的帮助将不胜感激。
编辑:谢谢! (。*?)作为魅力,如果你写答案,我会把它标记为已解决。谢谢!答案 0 :(得分:1)
你为什么不尝试这个?
$pattern = "~{{([^}{]*)}}~";
$replacement = "<b>$1</b>";
echo preg_replace($pattern, $replacement, $string);
.*
会做一场贪婪的比赛。也就是说它会占用第一个{{
和最后一个}}
大括号之间的所有内容。要进行尽可能短的匹配,您需要在?
之后添加量词*
。由于模式中存在捕获组,即(.*)
,所有匹配的字符都存储在第一个组中。这就是为什么你将字符串name}} is bo. Or {{not
加入到组1中。
模式说明:
{{
匹配两个开口花括号。 ([^}{]*)
匹配并捕获任何字符数零次或多次但不包括}
或{
}}
匹配两个结束花括号。