删除长单词正则表达式

时间:2011-07-19 08:25:07

标签: php 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

6 个答案:

答案 0 :(得分:5)

使用此正则表达式:\b\w{5,}\b。它将匹配长词。

  1. \b - 字边界
  2. \w{5,} - 字母数字5或更多重复
  3. \b - 字边界

答案 1 :(得分:1)

更好的方法是使用常规字符串操作而不是正则表达式?一个简单的内爆/爆炸和strlen会做得很好。当然,这取决于你的字符串的大小,但对于你的例子,它应该没问题。

答案 2 :(得分:1)

<?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

答案 3 :(得分:0)

你很亲密:

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

工作键盘示例:http://codepad.org/c5AN1E6M

此外,您需要将多个空格折叠为一个:

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

Example for this one

答案 4 :(得分:0)

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

答案 5 :(得分:0)

要点:

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