PHP автоматически определяет переводимые сообщения / обнаруживает фрагмент кода с помощью регулярных выражений

У меня есть мультиязычный сайт, который хранит переводимые файлы в файле default.php, заполненном массивом, который содержит все ключи.

Я бы предпочел сделать это автоматически.
У меня уже есть (одноэлементный) класс, который может обнаружить все мои файлы по типу. (Контроллер, действие, вид, модель и т. Д.)

Я хотел бы обнаружить любой фрагмент кода, формат которого выглядит следующим образом:

$this->translate('[a-zA-Z]');
$view->translate('[a-zA-Z]');
getView()->translate('[a-zA-Z]');
throw new Exception('[a-zA-Z]');
addMessage(array('message' => '[a-zA-Z]');

Однако он должен быть отфильтрован, когда начинается с / содержит:

$this->translate('((0-9)+_)[a-zA-Z]');
$this->translate('[a-zA-Z]' . $* . '[a-zA-Z]'); // Only a variable in the middle must filtered, begin or end is still allowed

ofcourse [a-zA-Z] является примером регулярного выражения.

Как я уже сказал, у меня уже есть класс, который обнаруживает определенные файлы. Этот класс также использует Reflection (или в данном случае Zend Reflection, так как я использую Zend). Однако я не смог найти способ отразить функцию с помощью регулярных выражений.

Действие будет помещено в cronjob и ручное действие, называемое action, поэтому это не является большой проблемой, когда используемая память слишком «слишком» велика.

1

Решение

[$]this->translate[(]'((?:[^'\\]|\\.|'')*)'[)];

Визуализация регулярных выражений

** Чтобы увидеть изображение лучше, просто щелкните правой кнопкой мыши изображение и выберите вид в новом окне

Это регулярное выражение будет делать следующее:

  • кодовые блоки, начинающиеся с $this-translate(' через это закрытие ');
  • помещает значение внутри ' цитаты в группу захвата 1
  • избегает беспорядочных краевых случаев, когда в подстроке может содержаться то, что выглядит как конец '); Строка, когда на самом деле символы могут быть экранированы.

Live Demo

https://regex101.com/r/eC5xQ6/

Пример текста

$This->Translate('(?:Droids\');{2}');
$NotTranalate('fdasad');
$this->translate('[a-zA-Z]');

Образцы матчей

MATCH 1
1.  [17-33] `(?:Droids\');{2}`

MATCH 2
1.  [79-87] `[a-zA-Z]`
NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
[$]                     any character of: '$'
----------------------------------------------------------------------
this->translate           'this->translate'
----------------------------------------------------------------------
[(]                      any character of: '('
----------------------------------------------------------------------
'                        '\''
----------------------------------------------------------------------
(                        group and capture to \1:
----------------------------------------------------------------------
(?:                      group, but do not capture (0 or more
times (matching the most amount
possible)):
----------------------------------------------------------------------
[^'\\]                   any character except: ''', '\\'
----------------------------------------------------------------------
|                        OR
----------------------------------------------------------------------
\\                       '\'
----------------------------------------------------------------------
.                        any character except \n
----------------------------------------------------------------------
|                        OR
----------------------------------------------------------------------
''                       '\'\''
----------------------------------------------------------------------
)*                       end of grouping
----------------------------------------------------------------------
)                        end of \1
----------------------------------------------------------------------
'                        '\''
----------------------------------------------------------------------
[)]                      any character of: ')'
----------------------------------------------------------------------
;                        ';'
----------------------------------------------------------------------
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector