Регулярное выражение, фильтрующее все функции перевода - PullRequest
1 голос
/ 07 декабря 2011

Я работаю над веб-интерфейсом, который предоставляет такую ​​же функцию, как poEdit.

Я хочу пройтись по всем файлам .php в указанной папке и искать перевод в каждой строке. Для этого я хотел бы использовать регулярное выражение, ищущее фактическую строку в файле php и возвращающее параметр translation-text и параметр domain.

Моя функция выглядит так:

__('This is my translation', 'domain');

Но поскольку для доменного параметра я определил значение по умолчанию, функцию __ () также можно вызывать так:

__('this is my translation');

Сейчас в PHP я пытался использовать функцию preg_match_all (), но я не могу объединить свое регулярное выражение.

Вот пример возможной строки в скрипте и выходного массива, который я хотел бы получить с помощью функции preg_match_all ():

echo __('Hello World'); echo __('Some domain specific translation', 'mydomain');

Выход массива:

Array
(
    [0] => Array
        (
            [0] => Hello World
        )

    [1] => Array
        (
            [0] => Some domain specific translation.
            [1] => mydomain
        )
)

Может кто-нибудь помочь мне с флагами Regex и preg_math_all ()?

Спасибо, ребята.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Регулярное выражение, которое вам потребуется для этого, значительно сложнее.

__\(\s*(['"])((?:(?!(?<!\\)\1).)+)\1(?:,\s*(['"])((?:(?!(?<!\\)\3).)+)\3)?\s*\)

Совпадения будут в группах 2 и 4, например,

__('This is my translation', 'domain');

приведет к получению этих групп:

  1. '
  2. This is my translation
  3. '
  4. domain

и это

__('This is my \'translation\'', "domain");

будет производить следующие группы:

  1. '
  2. This is my \'translation\'
  3. "
  4. domain
1 голос
/ 07 декабря 2011

Нечто подобное должно работать.Необходимо смещение массива, потому что нулевой элемент всегда будет содержать полное совпадение, нет флага для его исключения AFAIK.

if(preg_match_all('/__\(\s*\'((?:[^\']|(?<=\\\)\')+)\'(?:\s*,\s*\'((?:[^\']|(?<=\\\)\')+)\')?\s*\)/us', $data, $result)) {
  foreach ($result as &$item) {
    array_shift($item);
  }
  unset($item);
  var_dump($result);
}

Он правильно находит вызовы, подобные этим __ ('lorem \' ipsum ',' my \ 'домен').Однако, он потерпит неудачу в __ ('lorem \\').

...