2015-03-01 5 views
1

Я пытаюсь получить из текста все строки, которые находятся между 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

Это ') "и ') 'или'") и'') '? – Toto

+0

@JESUISCHARLIE кажется опечаткой. –

+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 отбрасывает ранее совпавшие символы из печати в финале.

+0

То, что мне нужно, большое спасибо! –

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