Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL按顺序选择单词的第一个字母进行搜索_Php_Mysql_Regex_Match - Fatal编程技术网

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
  • 还有别的吗

按标题选择id、title、upper(左(title,1))作为门店订单的第一个字母

您能解释一下逻辑吗?如果用户类型
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,但不是为了拼写错误。现在修复了。