替换双花括号regex中的字符

  • 本文关键字:字符 regex 替换 php regex
  • 更新时间 :
  • 英文 :


我试图用双花括号内的_替换-字符。

示例输入:Hello {{first-name}}, how are you?The event {{event-name-address}}

示例输出:Hello {{first_name}}, how are you?The event {{event_name_address}}

这是我试图做的正则表达式:{{.+(-).+}},这是preg_replacePHP函数我试图使用:$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个或多个字符,然后是}}

最新更新