我试图用双花括号内的_
替换-
字符。
示例输入:Hello {{first-name}}, how are you?
The event {{event-name-address}}
示例输出:Hello {{first_name}}, how are you?
The event {{event_name_address}}
这是我试图做的正则表达式:{{.+(-).+}}
,这是preg_replace
PHP函数我试图使用:$template = preg_replace("{{.+(-).+}}", "$1_", $template);
这似乎不工作。
我做错了什么?谢谢!
曲线括号应该转义,它们是正则表达式元符号。然后,在-
之前和之后的部分使用两组:
({{[^}]+)-([^}]+}})
并替换${1}_$2
。
[^}]
用于表示";"任何符号,但不能表示}
";"。
UPD:感谢@CarySwoveland帮助澄清。
如果双括号匹配且没有嵌套,则可以替换
的匹配(?<=[^{])-(?=[^{}]+}})
"_"。这假定匹配的双括号之间的连字符必须在'{'
以外的字符之前,并且必须后跟'}'
以外的字符。1
注意,这允许用相同的双括号匹配多个连字符。
这依赖于这样的假设:如果连字符后面跟着一对结束双括号(既不是开括号也不是闭括号),那么连字符前面必须有一对开双括号,中间的字符既不是开括号也不是闭括号。
演示正则表达式可以分解如下:
(?<= # begin a positive lookbehind
[^{] # match a character other than '{'
) # end positive lookbehind
- # match '-'
(?= # begin a positive lookahead
[^{}]+ # match one or more characters other than '{' and '}'
}} # match '}}'
) # end positive lookahead
<一口>1。如果不需要,表达式可以简化为-(?=[^{}]*}})
。一口>
可以使用
preg_replace('~(?:G(?!^)|{{)[^{}-]*K-(?=[^{}]*}})~', '_', $template)
参见regex演示。细节:
(?:G(?!^)|{{)
-前一个匹配的结束或{{
[^{}-]*
- 0个或多个{
,}
和-
字符以外的字符K
-匹配重置操作符,省略到目前为止从内存缓冲区匹配的文本-
-连字符(?=[^{}]*}})
-紧接在{
和}
之后的0个或多个字符,然后是}}
。