i18nメッセージを検索するためにプロジェクトのすべてのファイルを読み取るタスクを(PHPで)構築しています。次のようなメッセージを検出したい:
// Basic example
__('Show in English') => Show in English
// Get the message and the name of the i18n file
__("Show in English", array(), 'page') => Show in English, page
// Be careful of quotes
__("View Mary's Car", array()) => View Mary's Car
// Be careful of strings after the __() expression
__('at').' '.function($param) => at
これらのケースで機能する正規表現(他にもいくつかのケースが考慮されています)は次のとおりです。
__\(.*?['|\"](.*?)(?:['|\"][\.|,|\)])(?: *?array\(.*?\),.*?['|\"](.*?)['|\"]\)[^\)])?
ただし、式が複数行にある場合は機能しません。dotailを含める必要/s
がありますが、先を見据えるタイミングを適切に制御できないため、以前の正規表現が壊れます。
// Detect with multiple lines
echo __('title_in_place', array(
'%title%' => $place['title']
), 'welcome-user'); ?>
問題を解決し、開閉括弧に一致する正規表現を単純化することが1つあります。したがって、中身__()
や括弧の数に関係なく、開始数を「カウント」し、その数の終了数を予測します。
出来ますか?どのように?どうもありがとう!