Regex - PHP Lookaround - PullRequest
       12

Regex - PHP Lookaround

4 голосов
/ 09 марта 2010

У меня есть строка, такая как:

$foo = 'Hello __("How are you") I am __("very good thank you")'

Я знаю, что это странная нить, но, пожалуйста, останься со мной

Мне нужно выражение регулярного выражения, которое будет искать содержимое между __ («Искать содержимое здесь») и поместите его в массив.

т.е. регулярное выражение будет найти "Как дела" и "очень хорошо спасибо".

Ответы [ 2 ]

7 голосов
/ 09 марта 2010

Попробуйте это:

preg_match_all('/(?<=__\(").*?(?="\))/s', $foo, $matches);
print_r($matches);

, что означает:

(?<=     # start positive look behind
  __\("  #   match the characters '__("'
)        # end positive look behind
.*?      # match any character and repeat it zero or more times, reluctantly
(?=      # start positive look ahead
  "\)    #   match the characters '")'
)        # end positive look ahead

EDIT

И, как упоминал Грег: кто-то, кто не слишком знаком с осмотрами, может быть более читабельным, если их пропустить. Затем вы сопоставляете все: __(", string и ") и заключаете регулярное выражение, соответствующее string , .*?, в круглые скобки, чтобы захватывать только эти символы. Затем вам нужно будет получить свои спички, хотя $matches[1]. Демо:

preg_match_all('/__\("(.*?)"\)/', $foo, $matches);
print_r($matches[1]);
2 голосов
/ 09 марта 2010

Если вы хотите воспользоваться предложением Гамбо, ему предоставляется кредит на шаблон:

$foo = 'Hello __("How are you")I am __("very good thank you")';

preg_match_all('/__\("([^"]*)"\)/', $foo, $matches);

Обязательно используйте $matches[1] для своих результатов, если только вы не хотите получать полные строчные результаты.

var_dump() из $matches:

array
  0 => 
    array
      0 => string '__("How are you")' (length=16)
      1 => string '__("very good thank you")' (length=25)
  1 => 
    array
      0 => string 'How are you' (length=10)
      1 => string 'very good thank you' (length=19)
...