我应该以这种方式从文本结构中提取多语种内容:
一些意大利文本/it英语文本/en bla bla bla
其他文本其他意大利语/it其他英语文本/en bla bla bla
我将摘取所有不附在beetwen多语种方括号内的案文和附在beetwen当前语文方括号内的案文。
例如,如果当前语言为"en“,我将提取以下文本:
一些文本英语文本bla
其他英文文本
如何使用正则表达式正确提取文本?
发布于 2011-07-26 13:51:46
喜欢
$result = preg_replace_callback("~\[ (\w+) \] (.*?) \[ /\\1 \]~sx",
function($m) { return $m[1] == "en" ? $m[2] : ""; },
$text);发布于 2011-07-26 13:50:34
假设这些标记是正确平衡的,并且永远不会嵌套(这看起来是一个合理的假设),您可以这样做:
$result = preg_replace('%\[it\].*?\[/it\]\s*|\[/?en\]\s*%s', '', $subject);它专门查找和删除[it]-enclosed文本(以及[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发布于 2011-07-26 14:35:32
我认为最好不要使用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']
);https://stackoverflow.com/questions/6830970
复制相似问题