我目前正在使用以下正则表达式从字符串中删除小字(< 4 chars)。
$dirty = "I welcome you to San Diego";
$clean = preg_replace("/\b[^\s]{1,3}\b/", "", $dirty);
所以,这将导致“欢迎迭戈”;
但是,我现在需要忽略被替换的某些单词,例如:
$ignore = array("San", "you");
会导致“欢迎你圣地亚哥”
答案 0 :(得分:9)
您可以使用(?!..)
negative assertion
preg_replace("/\b(?!San|you|not)\w{1,3}\b/", "", ...
另外,我只会使用\w
代替[^\s]
,所以它实际上只匹配字词。
答案 1 :(得分:5)
我建议使用回调(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。