我目前使用以下正则表达式从字符串中删除长度小于4个字符的单词。
$dirty = "I welcome you to San Diego";
$clean = preg_replace("/\b[^\s]{1,3}\b/", "", $dirty);
因此,这将导致“欢迎Diego”;
然而,现在我需要忽略某些单词的替换,例如:
$ignore = array("San", "you");
会导致"欢迎您圣地亚哥"的结果。
您可以使用(?!..)
负向断言来嵌入您的忽略列表:
preg_replace("/\b(?!San|you|not)\w{1,3}\b/", "", ...
\w
而不是 [^\s]
,以便只匹配单词。|
分隔的单词列表也更容易。但是无论如何,我还是点赞了回调函数的替代方案;}即使只是因为我认为preg_replace_callback提及得太少了。 - mariopreg_quote
运行之前应该使用|
进行拼接,但这也可以在一行中使用array_map
完成,所以这并不是一个大问题。不知道为什么这个答案没有被接受。 - Alix Axel我建议使用回调函数 (preg_replace_callback),因为它可以提供更具可维护性的解决方案,如果你需要处理大量的单词:
echo preg_replace_callback(
'/\b[^\s]{1,3}\b/',
create_function(
'$matches',
'$ignore = array("San", "you");
if (in_array($matches[0], $ignore)) {
return $matches[0];
} else {
return \'\';
}'
),
"I welcome you to San Diego"
);
// output: welcome you San Diego
如果您使用的是 PHP 5.3 或更高版本,可以使用匿名函数代替调用 create_function。
\b\w{1,3}\b
。 - tchrist
[^\s]
用于代替\S
,你是否意识到\b
的定义不是基于\S
和\s
,而是仅基于\w
? - tchrist