如何从字符串中删除(大多数)短字

时间:2011-04-28 22:12:33

标签: php regex

我目前正在使用以下正则表达式从字符串中删除小字(< 4 chars)。

$dirty = "I welcome you to San Diego";
$clean = preg_replace("/\b[^\s]{1,3}\b/", "", $dirty);

所以,这将导致“欢迎迭戈”;

但是,我现在需要忽略被替换的某些单词,例如:

$ignore = array("San", "you");

会导致“欢迎你圣地亚哥”

2 个答案:

答案 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