从搜索关键字中删除数字和短字

时间:2016-06-29 21:09:31

标签: php

我有一个插入查询,可以根据其他表中的现有内容,在搜索表中添加各种单词,用于关键字搜索我的网站。

我的问题是,虽然我有一个常用的文字文件,但不包括像'和' '',我也希望消除长度小于3个字符的数字和单词。

有人可以帮忙吗?

$stripChars = array('.', ',', '!', '?', '(', ')', '%', '&', '"', '*', ':', ';', '@', ' - ', '/', '\\');
$string = str_replace($stripChars, ' ', $string);

$string = str_replace('  ', ' ', $string);
$words = explode(' ', $string);

return array_diff($words, $this->commonwords);

2 个答案:

答案 0 :(得分:2)

您可以使用此功能删除少于3个字符的字词:

$replaced = preg_replace('~\b[a-z]{1,2}\b\~', '', $text);

也可以用它来删除数字:

$replaced = preg_replace('/[0-9]+/', '', $text);

答案 1 :(得分:1)

您可以使用函数preg_replace在PHP中执行结构化Regex调用所要实现的目标。但是,查看问题中的代码可以通过使用正确的Regex和Preg_replace函数来改进:

$stripChars = array('.', ',', '!', '?', '(', ')', '%', '&', '"', '*', ':', ';', '@', ' - ', '/', '\\');
$string = str_replace($stripChars, ' ', $string);

让我们面对它,这看起来不是很清晰。 假设您只是想删除非字母数字字符,可以将其简化为:

$string = preg_replace("/[^a-z0-9_\s-]/i","",$string); 

告诉PHP替换所有的字符(由^克拉表示):az(/i表示不区分大小写)而不是0-9而不是下划线_而不是空格字符\s或短划线-。然后将它们替换为空(第二个字符串部分),因此被有效地删除。

您可以明显调整方括号中显示的内容以满足您的需要(稍后会看到这种情况......)。

在下一部分添加您的内容:

$string = str_replace('  ', ' ', $string);

您似乎想用一个空格字符替换多个空格,preg_replace可以为您做到这一点:

 $string = preg_replace("/\s+/", " ",$string);

\s是空格字符,+符号表示返回“贪婪且尽可能多”。

您的原始请求,用于删除2个或更少字符的数字和单词,preg_replace可以使用此答案第1部分中的代码,只需包含数字,省略[^a-z0-9_\s-]块中的数字,因此:[^a-z_\s-]数字现在将被删除。

要删除可以使用的短词:

$string = preg_replace("/\b[a-z]{1,2}\b/i","",$string);

这将概述带有单词边界\b的单词,然后定义任何长度在最小1和最大2 [a-z]之间的方括号{1,2}中的字符集合,\i再次使其不区分大小写,从而删除了这些词。

将它们全部包装在一起然后你有:

///remove anything that is not letters or underscore or whitespace
$string = preg_replace("/[^a-z_\s-]/i","",$string); 
/// remove short words
$string = preg_replace("/\b[a-z]{1,2}\b/i","",$string);
/// finally remove excess whitespaces 
$string = preg_replace("/\s+/", " ",$string);

删除空格是最后的,因为删除短词会使单词的每一侧留下空间,从而导致更长的空格块。

可能有一种方法可以将Regex组合成单个(或至少更少)的查询,但我不太擅长组合我担心的正则表达式调用。但是上面的代码比你当前的代码更聪明,更整洁,更强大。以及回答你的问题。

修改

要仅删除数字,您可以使用以下preg_replace代码:

$string = preg_replace("/\d+/","",$string);