tko*_*tan 3 php sql full-text-search pattern-matching sql-like
我希望将输入字符串与我的PHP页面匹配,就像SQL(MySQL)中的LIKE命令完成匹配一样,以保持其他搜索的一致性.从(我已经看到但不理解)一些PHP语法包括SQL命令我想知道这是否可能?
这样做的原因是我现在正在实现搜索关键字与数据库中存储在序列化数组中的字段,我必须在PHP中进行反序列化并根据数组的结构进行搜索.我无法查询表,只需要查询的匹配能力.否则我需要找到一个替代的匹配例程,这将不一致.我无法返回并重新构建数据库,因为这不是预期的方式回到规范中.是的,我需要一个丑陋的黑客,但我正在寻找最优雅的.
如果不可能,我可以使用任何将用户键入的文本作为关键字与存储文本匹配的建议.
编辑(澄清):我的主要问题是我没有彻底掌握LIKE命令如何工作(只是复制代码),并且由于关键字意味着某种程度的模糊性,如果我切换到关键字,我希望保留这种模糊性一个正则表达式.正如我所说的那样,正则表达式并不是那么好.我的查询是"LIKE'matmeme%'"
基于tomalak的评论和OIS使用preg_grep的绝妙主意,这可能更适合您的最终解决方案.
<?php
function convertLikeToRegex( $command )
{
return "/^" . str_replace( '%', '(.*?)', preg_quote( $command ) ) . "$/s";
}
function selectLikeMatches( $haystack, $needle )
{
return preg_grep( convertLikeToRegex( $needle ), $haystack );
}
$likeClauses = array(
'%foo'
,'foo%'
,'%foo%'
);
$testInput = array(
'foobar'
,'barfoo'
,'barfoobaz'
);
foreach ( $likeClauses as $clause )
{
echo "Testing $clause:";
echo '<pre>';
print_r( selectLikeMatches( $testInput, $clause ) );
echo '</pre>';
}
Run Code Online (Sandbox Code Playgroud)
这跟你所追求的一致吗?
<?php
function convertLikeToRegex( $command )
{
return "/^" . str_replace( '%', '(.*?)', $command ) . "$/s";
}
$likeClauses = array(
'%foo'
,'foo%'
,'%foo%'
);
$testInput = array(
'foobar'
,'barfoo'
,'barfoobaz'
);
foreach ( $testInput as $test )
{
foreach ( $likeClauses as $clause )
{
echo "Testing '$test' against like('$clause'): ";
if ( preg_match( convertLikeToRegex( $clause ), $test ) )
{
echo 'Matched!';
} else {
echo 'Not Matched!';
}
echo '<br>';
}
echo '<hr>';
}
Run Code Online (Sandbox Code Playgroud)