簡體   English   中英

如何使用正則表達式提取多語言內容

[英]How to use regular expressions to extract multilingual content

我應該以這種方式從文本結構中提取多語言內容:

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

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

我將提取不包含beetwen多語言方括號的所有文本和包含beetwen當前語言方括號的文本。

例如,如果當前語言是“ en”,我將提取以下文本:

一些文本英文文本bla bla bla

其他文字其他英文文字bla bla bla

如何使用正則表達式正確提取文本?

喜歡

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

假設這些標簽正確平衡並且永遠不會嵌套(這看起來是一個合理的假設),則可以執行以下操作:

$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

我認為最好不要為此使用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']
         );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM