我应该以这种方式从文本结构中提取多语言内容:
一些文字[it]意大利文[/ it] [en]英文文本[/ en] bla bla bla
其他文字[it]其他意大利语[/ it] [en]其他英文文本[/ en] bla bla bla
我将提取所有不包含beetwen多语言方括号的文本和包含beetwen当前语言方括号的文本。
例如,如果当前语言为“en”,我将提取以下文本:
一些文字英文文本bla bla bla
其他文本其他英文文本bla bla bla
如何使用正则表达式正确提取文本?
答案 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']
);