我想如何从字符串中删除长词。长度大于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
。它将匹配长单词。
-
'b
-字边界 -
'w{5,}
-字母数字5
或更多重复 -
'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 ReallyLongStringComesHere 123';
$patterns = array(
'html_space' => '/ /',
'long_words' => '/[^'s]{5,}/',
'multiple_spaces' => '/'s{2,}/'
);
$replacements = array(
'html_space' => ' ',
'long_words' => '',
'multiple_spaces' => ' '
);
echo str_replace(' ', ' ', trim(preg_replace($patterns, $replacements, $s)));
?>
输出:123 123
更好的方法可能是使用常规字符串操作而不是正则表达式?一个简单的内爆/爆炸和斯特林就可以了。当然,这取决于字符串的大小,但对于您的示例,它应该是好的
你很接近了:
preg_replace("~'w{5,}~", "", $s);
工作代码示例:http://codepad.org/c5AN1E6M
另外,您还需要将多个空格合并为一个:
preg_replace("~ +~", " ", $s);
添加全局修饰符g
或使用preg_match_all()
总结:
- 任何以
's
开头或结尾的答案将无法删除字符串开头和结尾的单词(并且您应该使用一个失败的测试字符串!) -
'b
不会像那样失败,但它不会删除空白。你可以结合建议的双空格删除器,但不会保留原始的重复空格(这可能不是问题)。 - explosion +implode有一个很好的属性,它保留重复的空白,但你必须为每个空白字符做。
- 保留空白的另一种选择(我在这里没有看到)是使用两种模式,一种以
'b
开始,以's
结束,另一种以's
开始,以$
结束。