У меня есть мультиязычный сайт, который хранит переводимые файлы в файле 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, поэтому это не является большой проблемой, когда используемая память слишком «слишком» велика.
[$]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: ')'
----------------------------------------------------------------------
; ';'
----------------------------------------------------------------------
Других решений пока нет …