私は例えば、PHPファイルから読み込まれている文字列を持っている:PHP - 正規表現の問題
<?php
// Dream Portal (c) 2009-2010 Dream Portal Team
// DreamPortal.english.php; @1.1
global $scripturl, $context;
// General Strings
$txt['forum'] = 'Forum';
$txt['dream_portal'] = 'Dream Portal';
$txt['dp_core_modules'] = 'Collapse or Expand this Module';
$txt['dp_who_forum'] = 'Viewing the forum index of <a href="' . $scripturl . '?action=forum">' . $context['forum_name'] . '</a>.';
$txt['dp_who_portal'] = 'Viewing the portal index of <a href="' . $scripturl . '">' . $context['forum_name'] . '</a>.';
$txt['dp_who_page'] = 'Viewing the page "<a href="' . $scripturl . '?page=%1$s">%2$s</a>".';
?>
そして、ここでは私が必要なものをしている、現在使用していREGEXです:
$data = file_get_contents('./'.$language.'/'.$file.'.'.$language.'.php');
$codes = array (
'/(\' \. \$)(.+?)(\. \')/',
'/(\= \$)(.+?)(\. \')/',
'/(\' \. \$)(.+?)(\;)/',
'/(\[\')(.+?)(\'\])/',
'/<\?php/s', '/\?>/s', '/<\?/s'
);
$html = array (
'{$2}',
'= \'{$2}',
'{$2}\';',
'[$2]',
'',
);
// Since we don't have the values for the vars.
$data = preg_replace($codes, $html, $data);
を
これらの文字列は常に変化しているので、しかし、$のTXTの配列変数のいずれかに挿入/このような文字列が必要なことが起こり得る:
$txt['dp_who_page'] = 'Viewing the page "<a href="'.$scripturl.'?page=%1$s">%2$s</a>" . ';
、私は必要な場合のいずれにおいても
$txt['dp_who_page'] = 'Viewing the page "<a href="' . $scripturl . '?page=%1$s">%2$s</a>".';
:変数が.
と文字列変数の末尾に束ねている
は、このだった、前述されたものと異なっている。この. ';
を持っていますそれは上記の$ txt ['dp_who_page']を次のように返します:
は現在、それが右の2番目のケースでは動作しません。{context [forum_name]}のフォーラムインデックスを表示しています。
は、どのように私は上記の両方のケースについては、上記次にpreg_replaceコードを使用して、これを行うことができますか?何を変更する必要がありますか?
私は、変数を抽出するためにeval()
PHP関数を使用しています。ここ
OKは、全体の関数である。
function loadLanguageFile($language, $file) {
$temp = array();
$data = file_get_contents('./'.$language.'/'.$file.'.'.$language.'.php');
$codes = array (
'/(\' \. \$)(.+?)(\. \')/',
'/(\= \$)(.+?)(\. \')/',
'/(\' \. \$)(.+?)(\;)/',
'/(\[\')(.+?)(\'\])/',
'/<\?php/s', '/\?>/s', '/<\?/s'
);
$html = array (
'{$2}',
'= \'{$2}',
'{$2}\';',
'[$2]',
'',
);
// Since we don't have the values for the vars.
$data = preg_replace($codes, $html, $data);
// We must change this because they are global.
$data = str_replace('$txt', '$langEditor_txt', $data);
$data = str_replace('$helptxt', '$langEditor_helptxt', $data);
eval($data);
if (isset($langEditor_txt)) {
$temp['txt'] = $langEditor_txt;
unset($GLOBALS['langEditor_txt']);
}
if (isset($langEditor_helptxt)) {
$temp['helptxt'] = $langEditor_helptxt;
unset($GLOBALS['langEditor_helptxt']);
}
return $temp;
}
あなたは英語に基づいて、基本的に、私は、文字列が簡単な言語に翻訳することができるようにしたい、私が達成しようとしているものを見るためにここに行くことができますこれらの言語の文字列:Language TEST using this function to load the language。言語を編集するよりも言語をクリックすると(現在はスペイン語、フランス語、英語のみ)、preg_replaceが有効になります。また、DreamPortal言語を編集した場合は、それが何をすべきかの良い例です。 (あなたがCreate It
リンクをクリックするよりも、言語View
リンクをクリックした後)は、すべての言語の実際の英語のファイルから英語の文字列をアップロードしている。また、デフォルトのテキストのtextareaボックスがあります。したがって、preg_replaceはこれを使用して、その特定の文字列定義をDefault text textareaに入力します。
あなたは**完全に**あなたのi18nの実装を再考する必要があると思います。 – prodigitalson
誰か助けてくれますか?このpreg_replaceを複数の言語で使用します。すべての言語ではないにせよ、ほとんどをサポートする必要があります。文字列を編集してi18nのためのより良いシステムにする必要がある場合は、これに最も適したものを教えてください。ありがとう:) – SoLoGHoST
あなたのregexesが達成するはずのことを理解することは本当に難しいです。また、エスケープする場合は二重引用符を使用してください。文字列を翻訳するだけの場合は、gettext関数とsprintfを使用してください。 – mario