0

角括弧で囲まれたタグの間のテキストを取得しようとしています。

簡単な文字列の例を見てみましょう:

[フランス語]これはフランス語のテキストです[/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;
}
4

3 に答える 3

1

この特定の状況では:

function getTextInTag($text,$tag='english')
{
    $innerText = preg_replace('#^.*\['.$tag.'\](.+?)\[/'.$tag.'\].*$#','$1',$text);
    if($innerText == $text) $innerText = preg_replace('#^.*\[english\](.+?)\[/english\].*$#','$1',$text);
    $text = preg_replace('#(\[[^\]]+\].+?\[/[^\]]+\])+#','',$text);
    return $text.$innerText;
}

getTextInTag('This is a [french]French text[/french][english]English text[/english]'); //This is a English text
getTextInTag('This is a [french]French text[/french][english]English text[/english]','french'); //This is a French text
getTextInTag('This is a [french]French text[/french][english]English text[/english]','spanish'); //This is a English text
于 2013-07-18T15:22:06.147 に答える