我试图从文本中获取t("
和")
或t('
和')
之间的所有字符串。
我提出了正则表达式/[^t\(("|\')]*(?=("|\')\))/
,但它并没有忽视字符' t'当它不在之前时('。
例如:
$str = 'This is a text, t("string1"), t(\'string2\')';
preg_match_all('/[^t\(("|\')]*(?=("|\')\))/', $str, $m);
var_dump($m);
返回ring1
和ring2
,但我需要string1
和string2
。
您也可以考虑this。
答案 0 :(得分:3)
您需要为每个使用单独的正则表达式。
(?<=t\(").*?(?="\))|(?<=t\(\').*?(?='\))
<强>代码:强>
$re = "/(?<=t\\(\").*?(?=\"\\))|(?<=t\\(\\').*?(?='\\))/m";
$str = "This is a text, t(\"string1\"), t('string2')";
preg_match_all($re, $str, $matches);
或强>
将捕获组与\K
t\((['"])\K.*?(?=\1\))
\K
会丢弃先前在匹配时打印的匹配字符。
答案 1 :(得分:1)
您可以使用此模式执行以下几个步骤:
$pattern = '~t\((?|"([^"\\\]*+(?s:\\\.[^"\\\]*)*+)"\)|\'([^\'\\\]*+(?s:\\\.[^\'\\\]*)*+)\'\))~';
if (preg_match_all($pattern, $str, $matches))
print_r($matches[1]);
它有点长且重复,但它很快并且可以处理转义的报价。
细节:
t\(
(?| # Branch reset feature allows captures to have the same number
"
( # capture group 1
[^"\\]*+ # all that is not a double quote or a backslash
(?s: # non capturing group in singleline mode
\\. # an escaped character
[^"\\]* # all that is not a double quote or a backslash
)*+
)
"\)
| # OR the same with single quotes (and always in capture group 1)
'([^'\\]*+(?s:\\.[^'\\]*)*+)'\)
)