2011-07-19 197 views
3

我想如何从字符串中删除长词。大于长度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 
+0

@stereofrog - 是的,我应该已经定义了更好,它可以是任何字符 –

回答

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 
+0

不错,只有一个照顾网址也是 –

+0

@Imran Omar Bukhsh:谢谢!如果我的答案解决了您的问题,请考虑通过点击答案左侧的投票计数下方的勾号来接受它。 – Shef

+0

是的,我不介意这样做,但如果你可以通过还告诉我如何删除单词开头和结尾的单词,请使用  –

5

使用这个表达式:\b\w{5,}\b。它会匹配很长的单词。

  1. \b - 单词边界
  2. \w{5,} - 字母数字5或多次重复
  3. \b - 单词边界
+0

字符串它不会删除一个长的URL –

+0

@Imran,什么是“长的URL”?任何示例... –

+0

示例'testing 123 htttp://stackoverflow.com/questions/6744272/removing-long-words-regex/6744316#6744316测试123'; - 它不会删除url –

1

一个更好的办法也许使用的,而不是一个正则表达式规则的字符串操作?一个简单的implode /爆炸和strlen将很好地做。取决于你的字符串的大小,但对你的例子来说应该没问题。

0

你接近:

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

工作分区键盘例如:http://codepad.org/c5AN1E6M

而且,你要多个空格折叠成一个:

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

Example for this one

+0

它不会删除一个长url –

0

添加全局修饰符g或我们e preg_match_all()

0

摘要:

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

任何人都可以在这里找到bug吗? ;) –

+0

没有错误,只是一个不完整的解决方案,检查答案标记为正确的 –

+0

有一个错误,我可以向你保证。关于另一个答案:好吧,你没有在问题中指定,你在我的答案后询问了这个问题。顺便说一句,如果你不想保留空白的解决方案是好的。 –