我试图编写一个匹配字符串的正则表达式如下:
translate("some text here")
和
translate('some text here')
我已经做到了:
preg_match ('/translate\("(.*?)"\)*/', $line, $m)

但如果有单引号,如何添加,而不是加倍。它应该匹配为单引号,双引号。
答案 0 :(得分:3)
你可以去:
translate\( # translate( literally
(['"]) # capture a single/double quote to group 1
.+? # match anything except a newline lazily
\1 # up to the formerly captured quote
\) # and a closing parenthesis
查看this approach on regex101.com的演示
<小时/> 在PHP
中,这将是:
<?php
$regex = '~
translate\( # translate( literally
([\'"]) # capture a single/double quote to group 1
.+? # match anything except a newline lazily
\1 # up to the formerly captured quote
\) # and a closing parenthesis
~x';
if (preg_match($regex, $string)) {
// do sth. here
}
?>
注意你不需要转义方括号([]
)中的两个引号,我只是为Stackoverflow求解器做了。
但请记住,这是相当容易出错的(如果有空格,转义引号?)。
translate\(
(['"])
(?:(?!\1).)*
\1
\)
它打开一个非捕获组,其中负向前瞻,确保不匹配以前捕获的组(本例中的引用)。
这消除了translate("a"b"c"d")
之类的匹配(请参阅a demo here)。
translate\(
(['"])
(?:
.*?(?=\1\))
)
\1
\)
答案 1 :(得分:2)
@translate\(
([\'"]) # capture quote char
((?:
(?!\1). # not a quote
| # or
\\\1 # escaped one
)* #
[^\\\\]?)\1 # match unescaped last quote char
\)@gx
ok: translate("some text here")
ok: translate('some text here')
ok: translate('"some text here..."')
ok: translate("a\"b\"c\"d")
ok: translate("")
no: translate("a\"b"c\"d")
答案 2 :(得分:1)
您可以使用管道(|)替换表达式组件,如下所示:
preg_match ('/translate(\("(.*?)"\)|\(\'(.*?)\'\))/', $line, $m)
编辑:之前也匹配translate("some text here')
。这应该可以,但你必须以某些语言来逃避引号。