php - complex regex on custom string tags -
i'm trying text between tags made in square brackets.
let see simple string example:
[french]this french text[/french][english]this english text[/english]
and in php (using 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); } how more complex solution?
i mean if language not set -> use default (english). if string contains string outside tags display along selected language. if string not contains language requested -> display default (or if default not set, display first found in string. examples:
$this->language->__set("deflang", "english"); $str = "this [french]french text[/french][english]english text[/english]"; $this->language->lang = "french"; return $this->language->translate($str); //output: french text $str = "this [deutch]deutch text[/deutch][english]english text[/english]"; $this->language->lang = "french"; return $this->language->translate($str); //output: english text $str = "this [french]french text[/french][deutch]deutch text[/deutch]"; $this->language->lang = "english"; return $this->language->translate($str); //output: french text what best way using php? suspect require complex regex, i'm not familiar regex, i'd know if there's other way.
edit:
based on answer provided jeff (https://stackoverflow.com/a/17727494/962734), made function works in cases. thanks.
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 $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; }
you use like:
$exp = '/(\[(.+?)\])(.+?)\[\/.+?\]/i'; $str = "this [french]french text[/french] , [english]english text[/english]"; $m = preg_match_all( $exp, $str, $matches); echo "<pre>"; var_dump( $matches); echo "</pre>"; this return
array(4) { [0]=> array(2) { [0]=>string(28) "[french]french text[/french]" [1]=>string(31) "[english]english text[/english]" } [1]=> array(2) { [0]=> string(8) "[french]" [1]=> string(9) "[english]" } [2]=> array(2) { [0]=>string(6) "french" [1]=>string(7) "english" } [3]=> array(2) { [0]=>string(11) "french text" [1]=>string(12) "english text" } } so access array[2] language name , array[3] actual text.
Comments
Post a Comment