如何使用正则表达式提取多语言内容

时间:2011-07-26 13:45:59

标签: php regex

我应该以这种方式从文本结构中提取多语言内容:

  

一些文字[it]意大利文[/ it] [en]英文文本[/ en] bla bla bla

     

其他文字[it]其他意大利语[/ it] [en]其他英文文本[/ en] bla bla bla

我将提取所有不包含beetwen多语言方括号的文本和包含beetwen当前语言方括号的文本。

例如,如果当前语言为“en”,我将提取以下文本:

  

一些文字英文文本bla bla bla

     

其他文本其他英文文本bla bla bla

如何使用正则表达式正确提取文本?

3 个答案:

答案 0 :(得分:2)

 $result = preg_replace_callback("~\[ (\w+) \] (.*?) \[ /\\1 \]~sx", 
       function($m) { return $m[1] == "en" ? $m[2] : ""; },
       $text);

答案 1 :(得分:1)

假设这些标签是正确平衡的并且永远不会嵌套(看起来像一个合理的假设),你可以这样做:

$result = preg_replace('%\[it\].*?\[/it\]\s*|\[/?en\]\s*%s', '', $subject);

这专门查找并删除[it] - 附上的文字(以及[en]标签本身)。

<强>解释

\[it\]     # Match [it]
.*?        # and everything that follows until 
\[/it\]    # the nearest [/it]
\s*        # plus any trailing whitespace
|          # or
\[/?en\]   # Match [en] or [/en]
\s*        # plus any trailing whitespace

如果要删除[en]标记之间的文本之间的任何文本,那么它会变得有点复杂(仍假设没有嵌套标记):

$result = preg_replace('%\[(?!/?en\b)([^\]]+)\].*?\[/\1\]\s*|\[/?en\]\s*%s', '', $subject);

<强>解释

\[         # Match [
(?!/?en\b) # Assert that this is not an [en] tag
([^\]]+)   # Match and capture the tag name (anything until the next ])
\]         # Match ]
.*?        # and everything that follows until 
\[/\1\]    # the nearest corresponding closing tag
\s*        # plus any trailing whitespace
|          # or
\[/?en\]   # Match [en] or [/en]
\s*        # plus any trailing whitespace

答案 2 :(得分:0)

我认为最好不要将preg_replace用于此

$languages = array(
      'en'=>array(
          'label' => 'english label'
      ),
      'it'=>array(
          'label' => 'italian label'
      )
    );

    $language = "it";
    $someTextForItalian = "bla bla bla bla %s bla bla bla.";    
    $someTextForItalian = 
         sprintf(
           $someTextForItalian,
           $languages[$language]['label']
         );