角括弧で囲まれたタグの間のテキストを取得しようとしています。
簡単な文字列の例を見てみましょう:
[フランス語]これはフランス語のテキストです[/french][english]これは英語のテキストです[/english]
そしてPHPで(https://stackoverflow.com/a/9826656/962734を使用):
private function translate($string)
{
$start = "[".$this->lang."]";
$end = "[/".$this->lang."]";
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return $string;
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
より複雑なソリューションはどうですか?
つまり、言語が設定されていない場合 -> デフォルト (英語) を使用します。文字列にタグの外側に文字列が含まれている場合、選択した言語に沿って表示されます。文字列に要求された言語が含まれていない場合 -> デフォルトを表示します (または、デフォルトが設定されていない場合は、文字列で最初に見つかったものを表示します。例:
$this->language->__set("defLang", "english");
$str = "This is a [french]French text[/french][english]English text[/english]";
$this->language->lang = "french";
return $this->language->translate($str);
//OUTPUT: This is a French text
$str = "This is a [deutch]Deutch text[/deutch][english]English text[/english]";
$this->language->lang = "french";
return $this->language->translate($str);
//OUTPUT: This is a English text
$str = "This is a [french]French text[/french][deutch]Deutch text[/deutch]";
$this->language->lang = "english";
return $this->language->translate($str);
//OUTPUT: This is a French text
PHPを使用してこれを行う最良の方法は何ですか? 複雑な正規表現が必要になると思いますが、正規表現に慣れていないので、他の方法があるかどうか知りたいです。
編集:
jeff ( https://stackoverflow.com/a/17727494/962734 ) から提供された回答に基づいて、ほとんどの場合に機能する関数を作成しました。ありがとう。
function translate($text)
{
$exp = '/(\[(.+?)\])(.+?)\[\/.+?\]/i';
$m = preg_match_all( $exp, $text, $matches);
if($m){
$mtchs = $matches[0];
$langs = $matches[2];
$texts = $matches[3];
$c = 0;
$foundLang = false;
$foundFirstOptionalLang = false;
foreach($langs as $l){
if($l == $this->lang){
$text = str_replace($mtchs[$c], $texts[$c], $text);
$foundLang = true;
}else{
if(!$foundFirstOptionalLang && $l == $this->defLang){
$optionalText = str_replace($mtchs[$c], $texts[$c], $text);
$foundFirstOptionalLang = true;
}
$text = str_replace($mtchs[$c], "", $text);
}
$c++;
}
if (!$foundLang) $text = $optionalText;
}
return $text;
}