Php MySQL按顺序选择单词的第一个字母进行搜索
示例词:Php MySQL按顺序选择单词的第一个字母进行搜索,php,mysql,regex,match,Php,Mysql,Regex,Match,示例词: iknkr st nm krt prk iknkr vhgr j k pth iknkr hkm st iknkr sr vhgr j k pth 所需条件 现在,如果用户键入:iks,查询将返回: iknkr st nm krt prk iknkr sr vhgr j k pth iknkr vhgr j k pth 如果用户键入:iv,查询将返回: iknkr st nm krt prk iknkr sr vhgr j k pth iknkr vhgr j k p
iknkr st nm krt prk
iknkr vhgr j k pth
iknkr hkm st
iknkr sr vhgr j k pth
所需条件
现在,如果用户键入:iks
,查询将返回:
iknkr st nm krt prk
iknkr sr vhgr j k pth
iknkr vhgr j k pth
如果用户键入:
iv
,查询将返回:
iknkr st nm krt prk
iknkr sr vhgr j k pth
iknkr vhgr j k pth
当前正在尝试:
SELECT `walpha` AS word, pageID AS id
FROM `SX01`
WHERE `table`= 'S01'
AND `walpha` like '" . $this->db->escape_like_str($searchVal['keyword']) . "%'
LIMIT 100"
但是使用此用户必须键入:iknkr s
结果
iknkr st nm krt prk
iknkr sr vhgr j k pth
任何人都可以建议,正确的方法是什么。您可以从输入构建一个数据库,然后使用它让MySQL使用它。例如,您可以将ik s
转换为^ik[a-z]*s
,以匹配以ik
开头的单词,然后是以s
开头的单词
SELECT words FROM tbl WHERE t.words REGEXP '^ik[a-z]* s';
表示我们必须从字符串开始匹配^
必须是前两个字符ik
将匹配任何小写字母字符[a-z]
允许我们匹配零个或多个先前模式-即,任何字符序列都可以跟随*
ik
则必须有一个空格
后面跟着一个s-我们不关心后面的内容s
您可以通过使用
[a-z]*
替换所有空格并使用^
前缀从用户输入构建此模式如果我正确理解您的逻辑,您可以尝试以下查询:
select `walpha` AS word, pageID AS id
from `SX01`
where
`table`= 'S01'
and `walpha` like concat(replace('" . $yoursearchval . "', ' ', '% '), '%')
limit 100
例如:
concat(replace('i k', ' ', '% '), '%')
将成为:
i% k%
^i[^[:space:]]+ k
但如果希望单词是连续的,则必须使用正则表达式:
where whalpa regexp concat('^', replace('i k', ' ', '[^[:space:]]+ '))
我将成为:
i% k%
^i[^[:space:]]+ k
- 字符串必须以i开头
- 在i之后,必须至少+一个非空格字符
- 然后是一个空间
- 然后一个k
- 还有别的吗
ik
您想要包含或以ik
开头的单词?以ik
开头,但搜索将从第一个单词开始,如果用户类型ik s vb n
,则它将匹配第一个单词的ik
,第二个单词的s
,第三个单词的vb
和第四个单词的n
,并在此基础上显示结果,因此,如果两个单词(如ik s
),第一个单词需要以ik
开头,第二个单词以s
开头?@JuanCarlosOropeza OP希望每个字符串用户输入都与其字符串中的一个单词匹配。所以“aabb”意味着字符串中的第一个单词必须以AA开头,第二个单词必须以BB开头。这至少是我在这篇令人困惑的帖子上的最佳猜测是的,这就是我想要的@LelioFaietaregular表达式对我来说很难。为什么不必包含s*
来表示其他内容?@JuanCarlosOropeza:*
符号表示ik之后的任何内容,[a-z]
表示它可以是任何字母字符。查询工作正常s*
表示“零个或多个s字符”,这不是您想要的。你只想确定下一步的工作是从s开始的,而不关心其余的。@prakashtank我理解第一个*
我的问题是为什么s
不需要*
。我可以用你的建议来解决这个问题-“选择`walpha`作为单词,`pageID`作为来自`SX01`的id,其中`table`='S01'和`walpha`regexp concat('^',替换(''''.$this->db->escape_like_str($searchVal['keyword'])。”,''.''''.[a-z]*'))限制100“
+1@pauldixon匹配的iknkr zzzz ssss
可能不是OP想要的-它不能确保第二个单词以s@PaulDixon是的,你是对的,我刚刚更新了我的答案,谢谢你我正在做你的拆分字符串,但小提琴不起作用:(@JuanCarlosOropeza sqlfiddle此刻看起来很低头……无论如何,我在答案的第二部分中包含了这个fiddle,所以如果你愿意,你可以在自己的服务器上尝试,我把它移到了rextester,但不是为了拼写错误。现在修复了。