2016-05-26 4 views
0

に私は関数から返されています以下のHTMLを持っていません以下:しかし出力HTMLは順番

$translation = preg_replace_callback("/\<i\>(.+?)\<\/i\>/", 'translator', $html); 

function translator($matches) { 
    return __t($matches[1]); 
} 

、ときに私はHTMLを出力 - echo $translation; - 私は、次を得る:

String that gets translated Another string<--this is not inside <i> tags 
<fieldset> 
    <legend>Title</legend> 
    <div> 
     <label> 
      <i></i> <--the string should be placed here 
     </label> 
     <textarea> 
      <i></i> <--and here 
     </textarea> 
    </div> 
</fieldset> 

この問題は一日中私の頭を困惑させていました。私はそれを整理する方法を見つけられません。 htmlと翻訳された文字列を正しい順序で出力するにはどうすればよいですか? DOMDocument::loadHTMLを使用する必要がありますか?

+0

あなたのコードと全く問題ありません:https://3v4l.org/4PhnAます([1] $マッチ) 'エコー__tしようとしたんでした。私はできません' 'echo' __t' – Akam

+0

@Akamを($ matches [1]) 'だけです。彼らはhtmlの残りの部分と一緒にエコーする必要があります。なぜこれは起こっているのですか?私はそれが '__t()'関数が文字列をエコーし​​、それを返さないためだと思います。どうすればこれを防ぐことができますか?私は '__t()'関数を編集することはできません。 – otinanai

+0

@Akam 't()'関数がエコーして文字列を返さないようにサンプルコードをチェックします:https://3v4l.org/HoprL – otinanai

答えて

2

出力バッファリング機能を使用します。

ob_flush(); // flush any pending output buffer 
ob_start(); 
$translation = preg_replace_callback("/\<i\>(.+?)\<\/i\>/", 'translator', $html); 
ob_end_clean(); 

function translator($matches) { 
    __t($matches[1]); 
    return ob_get_clean(); 
}