PHP喜欢类似于MySQL的东西,对于if语句?

时间:2011-02-06 08:13:45

标签: php mysql if-statement

我想要一个使用与mysql something LIKE '%something%'

相同的if语句

我想在php中构建一个if语句。

if ($something is like %$somethingother%)

有可能吗?

我提出这个问题的原因是我不想改变MySQL命令,它是一个包含许多内容的长页面,我不想为此构建不同的功能。

如果可能的话,请告诉我,如果可能,请告诉他们如何做。

11 个答案:

答案 0 :(得分:25)

  

if($ something就像%$ somethingother%)

     

有可能吗?

没有

  

我不想更改MySQL命令,它是一个包含许多内容的长页面

使用一些好的编辑器,它支持find& amp;中的正则表达式。替换,并将其转换为:

if(stripos($something, $somethingother) !== FALSE){

}

答案 1 :(得分:16)

我知道,这个问题不是实际的,但我已经解决了类似的问题:)

我的解决方案:

/**
 * SQL Like operator in PHP.
 * Returns TRUE if match else FALSE.
 * @param string $pattern
 * @param string $subject
 * @return bool
 */
function like_match($pattern, $subject)
{
    $pattern = str_replace('%', '.*', preg_quote($pattern, '/'));
    return (bool) preg_match("/^{$pattern}$/i", $subject);
}

示例:

like_match('%uc%','Lucy'); //TRUE
like_match('%cy', 'Lucy'); //TRUE
like_match('lu%', 'Lucy'); //TRUE
like_match('%lu', 'Lucy'); //FALSE
like_match('cy%', 'Lucy'); //FALSE

答案 2 :(得分:4)

查看strstr函数

答案 3 :(得分:2)

使用函数,在另一个字符串中搜索字符串,如:strstrstrpossubstr_count

答案 4 :(得分:1)

strpos()不起作用,所以我必须使用此preg_match()

$a = 'How are you?';

if (preg_match('/\bare\b/', $a)) {
    echo 'true';
}

像这样,例如我与单词“ are”匹配 希望对某人有帮助

答案 5 :(得分:0)

但你必须给小写字符串然后它会正常工作。 strstr函数示例:

$myString = "Hello, world!";
echo strstr( $myString, "wor" );                    // Displays 'world!'
echo ( strstr( $myString, "xyz" ) ? "Yes" : "No" ); // Displays 'No'

答案 6 :(得分:0)

使用此函数,其功能类似于SQL LIKE 运算符,但它将返回布尔值,并且您可以再使用一个if语句来设置自己的条件

function like($str, $searchTerm) {
    $searchTerm = strtolower($searchTerm);
    $str = strtolower($str);
    $pos = strpos($str, $searchTerm);
    if ($pos === false)
        return false;
    else
        return true;
}
$found = like('Apple', 'app'); //returns true
$notFound = like('Apple', 'lep'); //returns false

if($found){
    // This will execute only when the text is like the desired string
}

答案 7 :(得分:0)

如果您有权访问MySQL服务器,请使用MySQLi发送这样的查询:

$SQL="select case when '$Value' like '$Pattern' then 'True' else 'False' end as Result";
$Result=$MySQLi->query($SQL)->fetch_all(MYSQLI_ASSOC)[0]['Result'];

结果将是一个包含True或False的字符串。让PHP发挥自己的优势,并使用SQL进行点赞。

答案 8 :(得分:0)

我最近遇到了这个要求,并想到了:

/**
 * Removes the diacritical marks from a string.
 *
 * Diacritical marks: {@link https://unicode-table.com/blocks/combining-diacritical-marks/}
 *
 * @param string $string The string from which to strip the diacritical marks.
 * @return string Stripped string.
 */
function stripDiacriticalMarks(string $string): string
{
    return preg_replace('/[\x{0300}-\x{036f}]/u', '', \Normalizer::normalize($string , \Normalizer::FORM_KD));
}

/**
 * Checks if the string $haystack is like $needle, $needle can contain '%' and '_'
 * characters which will behave as if used in a SQL LIKE condition. Character escaping
 * is supported with '\'.
 *
 * @param string $haystack The string to check if it is like $needle.
 * @param string $needle The string used to check if $haystack is like it.
 * @param bool $ai Whether to check likeness in an accent-insensitive manner.
 * @param bool $ci Whether to check likeness in a case-insensitive manner.
 * @return bool True if $haystack is like $needle, otherwise, false.
 */
function like(string $haystack, string $needle, bool $ai = true, bool $ci = true): bool
{
    if ($ai) {
        $haystack = stripDiacriticalMarks($haystack);
        $needle = stripDiacriticalMarks($needle);
    }

    $needle = preg_quote($needle, '/');

    $tokens = [];

    $needleLength = strlen($needle);
    for ($i = 0; $i < $needleLength;) {
        if ($needle[$i] === '\\') {
            $i += 2;
            if ($i < $needleLength) {
                if ($needle[$i] === '\\') {
                    $tokens[] = '\\\\';
                    $i += 2;
                } else {
                    $tokens[] = $needle[$i];
                    ++$i;
                }
            } else {
                $tokens[] = '\\\\';
            }
        } else {
            switch ($needle[$i]) {
                case '_':
                    $tokens[] = '.';
                    break;
                case '%':
                    $tokens[] = '.*';
                    break;
                default:
                    $tokens[] = $needle[$i];
                    break;
            }
            ++$i;
        }
    }

    return preg_match('/^' . implode($tokens) . '$/u' . ($ci ? 'i' : ''), $haystack) === 1;
}

/**
 * Escapes a string in a way that `UString::like` will match it as-is, thus '%' and '_'
 * would match a literal '%' and '_' respectively (and not behave as in a SQL LIKE
 * condition).
 *
 * @param string $str The string to escape.
 * @return string The escaped string.
 */
function escapeLike(string $str): string
{
    return strtr($str, ['\\' => '\\\\', '%' => '\%', '_' => '\_']);
}

上面的代码是unicode感知的,能够捕获以下情况:

like('Hello ?', 'Hello _'); // true
like('Hello ?', '_e%o__');  // true
like('asdfas \\?H\\\\%?É\\l\\_?\\l\\o asdfasf', '%' . escapeLike('\\?h\\\\%?e\\l\\_?\\l\\o') . '%'); // true

您可以在https://3v4l.org/O9LX0上尝试所有这些操作

答案 9 :(得分:0)

我认为值得一提的是 PHP 8 中可用的 str_contains() 函数,它执行区分大小写的检查,指示一个字符串是否包含在另一个字符串中,返回 true 或 false。 >

从文档中获取的示例:

$string = 'The lazy fox jumped over the fence';

if (str_contains($string, 'lazy')) {
    echo "The string 'lazy' was found in the string\n";
}

if (str_contains($string, 'Lazy')) {
    echo 'The string "Lazy" was found in the string';
} else {
    echo '"Lazy" was not found because the case does not match';
}

//The above will output:
//The string 'lazy' was found in the string
//"Lazy" was not found because the case does not match

请参阅完整文档 here

答案 10 :(得分:0)

like_match() 例子是最好的 这个女巫 SQL 请求很简单(我之前使用过它),但是当您按数组键迭代时,like_match() 和 exost 数据库服务器资源的工作速度很慢,并且每轮命中数据库服务器时通常不需要请求。我通过模式元素让它更快地切割/收缩阵列,但阵列上的正则表达式总是更快。 我喜欢like_match() :)