【发布时间】:2011-02-02 22:26:44
【问题描述】:
我又卡住了。
我有一个搜索字符串并将其分配给一个变量:
my $search = 'foo bar blue widget'
$search =~ s/[\n\r]+|^\s+|\s+$//g; #remove leading and trailing spaces n stuff
我正在使用
SELECT FROM `sometable` WHERE `coltosearch` LIKE '%$search%'
但是,只会匹配“foo bar blue widget”或“foo”。
我也想匹配“foo bar”或“foobar”。
所以,我想我必须这样做:
my $search = 'foo bar blue widget';
$search =~ s/[\n\r]+|^\s+|\s+$//g; #remove leading and trailing spaces n stuff
my $search1 = $search;
$search1 =~ s/^\s+|\s+$|\s*//g; #remove all spaces
SELECT FROM `sometable` WHERE `coltosearch` LIKE '%$search%' OR LIKE '%$search1%'
嗯,这对于“foo bar blue widget”和“foobarbluewidget”可能没问题。 (如果有效)
所以,我猜我将不得不遍历 $search,并为每个单词分配变量。
但是,我永远不知道在 $search 中我会有多少个单词。
所以,我被困住了。我可以这样做吗:
my $search = 'foo bar blue widget'; #in from search form. Actually a $var
$search1 =~ s/^\s+|\s+$|\s*//g; #remove all spaces
$search1 = "%$search1%"; # Makes %foobarbluewidget%
## Now make individual words somehow ##
my @searcharry;
my $cnt='0';
my $searchword;
my @searchsplit = $search;
while $searchword (@searchsplit){
push (@searcharry,$searchword[$cnt]);
$cnt++;
}
但是我如何让@searcharry 进入:
$search =~ s/\s/%/gi;
$search =~ s/%%/%/gi; #I think makes %foo%bar%blue%widget%
所以我可以:
SELECT FROM `sometable` WHERE `coltosearch` LIKE '$search' OR LIKE '$search1'
我可能离基地很远。这对我来说真的很难。 我只想匹配搜索字符串中的任何单词,或者如果所有单词一起运行则匹配。
对不起,我是个菜鸟。我的粗鲁尝试,我相信是对 Perl 和真正的程序员的侮辱。
感谢您的帮助。
【问题讨论】:
-
MySQL 的 RLIKE 可能更容易使用:SELECT * FROM
tabWHEREcolRLIKE 'foo|bar|blue|widget'; -
如果字符串包含所有一起运行的搜索词,那么它也会匹配任何搜索词。为什么这比
col LIKE '%$term1%' OR col LIKE '%$term2%' OR ... col LIKE '%$term4%'更复杂?