我有一个插入查询,可以根据其他表中的现有内容,在搜索表中添加各种单词,用于关键字搜索我的网站。
我的问题是,虽然我有一个常用的文字文件,但不包括像'和' '',我也希望消除长度小于3个字符的数字和单词。
有人可以帮忙吗?
$stripChars = array('.', ',', '!', '?', '(', ')', '%', '&', '"', '*', ':', ';', '@', ' - ', '/', '\\');
$string = str_replace($stripChars, ' ', $string);
$string = str_replace(' ', ' ', $string);
$words = explode(' ', $string);
return array_diff($words, $this->commonwords);
答案 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);