2013-04-02 3 views
1

Я создал сборщик строк для перевода из файлов javascript. Я нашел проект jsgettext, который я использовал в качестве отправной точки (see).Регулярное выражение для извлечения вызовов метода javascript

Он использует выражение reqular, чтобы найти вызовы метода __() внутри файлов javascript. Простые вызовы найдены успешно, но вызовы с аргументами, такими как __('string', { a: 'b'}), не являются.

Я попытался изменить регулярное выражение так же, как и вызовы методов с аргументами, но без каких-либо успехов (я не специалист по регулярным выражениям).

Мой вопрос: Как изменить следующее регулярное выражение для соответствия строкам следующим образом?

// this is catched successfully 
// var string = __("Please enter %number% more characters."); 

// this is problematic 
var string = __("Please enter %number% more characters.", { '%number%' : 2 }); 

Регулярное выражение:

$keywords = join('|', array('__')); 
preg_match_all('# (?:' . $keywords . ') \(\\ *" ((?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\")*) (?<!\\\\)"\\ *\) #ix', $content, $matches, PREG_SET_ORDER); 

Спасибо

+0

Это '$ keywords = join ('|', array ('__'));' для меня не имеет смысла ... – HamZa

+1

Это предназначено для соответствия другим функциям i18n. Я удалил этот код из вопроса. – Mishal

ответ

0

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

__("Please enter %number% more characters.", { '%number%' : 2 }); 

Вам просто нужно, чтобы соответствовать :

__("Please enter %number% more characters.", 

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

Поэтому редактирование регулярного выражения на линиях 81 и 89 закончить с *(?:\)|,) #ix вместо *\) #ix должен быть достаточно хорошим.

+0

Спасибо @Vyktor, что работает отлично! – Mishal

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