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