2010-12-08 12 views
0

私は例えば、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 &quot;<a href="' . $scripturl . '?page=%1$s">%2$s</a>&quot;.'; 
?> 

そして、ここでは私が必要なものをしている、現在使用してい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 &quot;<a href="'.$scripturl.'?page=%1$s">%2$s</a>&quot; . '; 
、私は必要な場合のいずれにおいても

$txt['dp_who_page'] = 'Viewing the page &quot;<a href="' . $scripturl . '?page=%1$s">%2$s</a>&quot;.'; 

:変数が.と文字列変数の末尾に束ねている

は、このだった、前述されたものと異なっている。この. ';を持っていますそれは上記の$ txt ['dp_who_page']を次のように返します:

{context [forum_name]}のフォーラムインデックスを表示しています。

は現在、それが右の2番目のケースでは動作しません。

は、どのように私は上記の両方のケースについては、上記次に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に入力します。

+5

あなたは**完全に**あなたのi18nの実装を再考する必要があると思います。 – prodigitalson

+0

誰か助けてくれますか?このpreg_replaceを複数の言語で使用します。すべての言語ではないにせよ、ほとんどをサポートする必要があります。文字列を編集してi18nのためのより良いシステムにする必要がある場合は、これに最も適したものを教えてください。ありがとう:) – SoLoGHoST

+4

あなたのregexesが達成するはずのことを理解することは本当に難しいです。また、エスケープする場合は二重引用符を使用してください。文字列を翻訳するだけの場合は、gettext関数とsprintfを使用してください。 – mario

答えて

1

あなたがこれをやっている理由を私は理解していないが、当面の問題は、それらのここ-と-行っ-再びスペースのようです。即時ソリューションは、スペースをオプションにすることです:

'/(\'\s*\.\s*\$)(.+?)(\s*\.\s*\')/', 
'/(=\s*\$)(.+?)(\s*\.\s*\')/', 
'/(\'\s*\.\s*\$)(.+?)(;)/', 
'/(\[\')(.+?)(\'\])/', 
'/<\?php/s', '/\?>/s', '/<\?/s' 

\s*は、ゼロ個以上の空白文字にマッチします。

+0

これらの正規表現をすべて短縮するには、より良い方法がありますか?私は確かにもっと多くのオプションを用意しています。ありがとう、bytheway、それは動作します:) – SoLoGHoST

3

私はgettext()を使用することをお勧めします。この方法で、Poedittranslation memoryも使用する)のようなツールで編集可能なgettextカタログファイルを使用できます。

+0

私は 'gettext()'を使用する方法を理解していない、文字列はそれに渡されるようですが、どのように正確に? – SoLoGHoST

+0

関数を呼び出すだけです。 '_( '私は'を翻訳する必要があります ')'のようなもので、その文字列を翻訳テーブルに追加していれば翻訳された文字列を返します。最初にロケールを設定し、変換テーブルをバインドする必要があります。しかし、gettextのドキュメンテーションですべてが終わった。翻訳テーブルにバイナリ形式を使用する必要があるので、私は個人的にgettextのファンではありません。 Zend_Translateは多くのフォーマット(xliffとgettextが含まれています)をサポートしていますが、単一のインターフェースを使用しているため、この点では素晴らしいです。 – prodigitalson

+0

これはまた、あなたがしようとしているのと同じように、置き換えられた位置に置かれたテキスト置換をサポートしています。 – prodigitalson

1

もし私があなただったら、すでに提案されているgettextネイティブ機能を使用するか、Zend_Translateまたは別のi18nライブラリを使用します。

+0

+1 [Zend_Translate](http://framework.zend.com/manual/en/zend.translate.html) –