获取文本中匹配模式的所有字符串

时间:2015-03-01 12:13:35

标签: php regex

我试图从文本中获取t("")t('')之间的所有字符串。

我提出了正则表达式/[^t\(("|\')]*(?=("|\')\))/,但它并没有忽视字符' t'当它不在之前时('。

例如:

$str  = 'This is a text, t("string1"), t(\'string2\')';
preg_match_all('/[^t\(("|\')]*(?=("|\')\))/', $str, $m);
var_dump($m);

返回ring1ring2,但我需要string1string2

您也可以考虑this

2 个答案:

答案 0 :(得分:3)

您需要为每个使用单独的正则表达式。

(?<=t\(").*?(?="\))|(?<=t\(\').*?(?='\))

DEMO

<强>代码:

$re = "/(?<=t\\(\").*?(?=\"\\))|(?<=t\\(\\').*?(?='\\))/m";
$str = "This is a text, t(\"string1\"), t('string2')";

preg_match_all($re, $str, $matches);

将捕获组与\K

一起使用
t\((['"])\K.*?(?=\1\))

DEMO

\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:\\.[^'\\]*)*+)'\)
)

demo