小编典典

PHP无需数据库查询即可执行SQL LIKE匹配的方法?

sql

我想将输入字符串匹配到我的PHP页面,就像通过SQL(MySQL)中的LIKE命令所做的匹配一样,以确保其他搜索的一致性。由于(我已经看过但不理解)某些PHP语法包含SQL命令,所以我想知道这是否可能吗?

这样做的原因是,我现在正在实现对关键字的搜索,而不是对存储在序列化数组中的数据库中的字段的搜索,我必须在PHP中对其进行反序列化,并根据数组的结构进行搜索。我无法针对该表进行查询,只需要查询的匹配功能即可。否则,我需要找到一个替代的匹配例程,这将是不一致的。我不能回过头来重新构建数据库,因为在规范中并没有预料到这点。是的,我需要一个难看的技巧,但是我正在寻找最优雅的东西。

如果不可能的话,我可以使用将用户键入的文本匹配为存储文本的关键字的任何建议。

编辑(为澄清起见):我的主要问题是我对LIKE命令的工作方式没有足够的了解(仅复制代码),并且由于关键字暗示了某种程度的模糊性,如果我改用,我希望保留这种模糊性正则表达式。我对regex的好点是更好。我的查询是“喜欢’matchme%’”


阅读 201

收藏
2021-04-28

共1个答案

小编典典

更新

根据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>';
}

下面的原始帖子

这是您追求的目标吗?

<?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>';
}
2021-04-28