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

nei*_*eil 3 php regex

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

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

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

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

$ignore = array("San", "you");
Run Code Online (Sandbox Code Playgroud)

会导致"欢迎你圣地亚哥"

mar*_*rio 9

您可以使用(?!..) 否定断言嵌入忽略列表:

 preg_replace("/\b(?!San|you|not)\w{1,3}\b/", "", ...
Run Code Online (Sandbox Code Playgroud)

我也会使用\w而不是[^\s]它真的只匹配单词.

  • 这似乎是一种比回调更优雅的方法,它也可能表现得更好. (2认同)

web*_*ave 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 
Run Code Online (Sandbox Code Playgroud)

如果您使用的是PHP 5.3或更高版本,则可以使用匿名函数而不是调用create_function.