2016-07-04 2 views
1

У меня есть многоязычный сайт, в котором хранятся переводы в файле default.php, заполненные массивом, содержащим все ключи.PHP autodetect translateables/обнаружение фрагмента кода с помощью regex

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

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

$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 

of the course [a-zA-Z] - пример регулярного выражения.

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

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

+0

Можете ли вы изменить свой вопрос, чтобы показать пример строки вы хотите, чтобы соответствовать –

+0

Это уже там, $ это-перевод ('[A-Za-Z]); Строка будет меняться, но я всегда стараюсь сохранить ее так: _ _ . Например, «Controller_Default_Welcome» – IMarks

ответ

2

Описание

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

Regular expression visualization

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

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

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

Пример

Демо

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: ')' 
---------------------------------------------------------------------- 
    ;      ';' 
---------------------------------------------------------------------- 
+0

, я получаю следующую ошибку 'preg_match_all(): Ошибка компиляции: отсутствует) при смещении 45', используя следующий код' preg_match_all ("/ [$] this-> translate [(] '((?: [^ '\\] | \\. |' ') *)' [)];/mix ", $ this-> content, $ matches);' Edit: Получил работу 'preg_match_all ("/[$] this-translate [(] '((?: [^' \\\\] | \\\\. | '') *) '[)]/mix ", $ this-> content, $ matches); ' однако preg_match_all не возвращает результаты в $ matches; – IMarks

+0

В вашем первом примере у вас есть 'this-> translate', тогда как во втором примере у вас есть' this-translate'. Важен ли символ '>'? –

+0

Да, недостающее> было ошибкой,> или лучше сказано -> - вызов метода для перевода(); думал, что я исправил все это в своем коде, остался один балл, _shame_. Спасибо за вашу помощь – IMarks

Смежные вопросы