删除长单词regex


Removing long words regex

我想如何从字符串中删除长词。长度大于n.

我试了如下:

//remove words which have more than 5 characters from string
$s = 'abba bbbbbbbbbbbb 1234567 zxcee ytytytytytytytyt zczc xyz';
echo preg_replace("~'s(.{5,})'s~isU", " ", $s);

给出输出(不正确):

abba 1234567 ytytytytytytytyt zczc xyz

使用这个正则表达式:'b'w{5,}'b。它将匹配长单词。

  1. 'b -字边界
  2. 'w{5,} -字母数字5或更多重复
  3. 'b -字边界
<?php
//remove words which have more than 5 characters from string
$s = 'abba bbbbbbbbbbbb 1234567 zxcee ytytytytytytytyt zczc xyz';
$patterns = array(
    'long_words' => '/[^'s]{5,}/',
    'multiple_spaces' => '/'s{2,}/'
);
$replacements = array(
    'long_words' => '',
    'multiple_spaces' => ' '
);
echo trim(preg_replace($patterns, $replacements, $s));
?>
输出:

abba zczc xyz

更新,以解决您在评论中提出的问题。你可以这样做:

<?php
//remove words which have more than 5 characters from string
$s = '123&nbsp;ReallyLongStringComesHere&nbsp;123';
$patterns = array(
    'html_space' => '/&nbsp;/',
    'long_words' => '/[^'s]{5,}/',
    'multiple_spaces' => '/'s{2,}/'
);
$replacements = array(
    'html_space' => ' ',
    'long_words' => '',
    'multiple_spaces' => ' '
);
echo str_replace(' ', '&nbsp;', trim(preg_replace($patterns, $replacements, $s)));
?>
输出:

123&nbsp;123

更好的方法可能是使用常规字符串操作而不是正则表达式?一个简单的内爆/爆炸和斯特林就可以了。当然,这取决于字符串的大小,但对于您的示例,它应该是好的

你很接近了:

preg_replace("~'w{5,}~", "", $s);

工作代码示例:http://codepad.org/c5AN1E6M

另外,您还需要将多个空格合并为一个:

preg_replace("~ +~", " ", $s);

添加全局修饰符g或使用preg_match_all()

总结:

  • 任何以's开头或结尾的答案将无法删除字符串开头和结尾的单词(并且您应该使用一个失败的测试字符串!)
  • 'b不会像那样失败,但它不会删除空白。你可以结合建议的双空格删除器,但不会保留原始的重复空格(这可能不是问题)。
  • explosion +implode有一个很好的属性,它保留重复的空白,但你必须为每个空白字符做。
  • 保留空白的另一种选择(我在这里没有看到)是使用两种模式,一种以'b开始,以's结束,另一种以's开始,以$结束。