【问题标题】:PHP - Trouble matching strings in variablePHP - 无法匹配变量中的字符串
【发布时间】:2019-01-16 14:16:03
【问题描述】:

我有一个文件夹结构,两个文件夹被命名为 ComputerScience 和 Science

问题是当我需要同时匹配变量时,我的代码总是检测到变量包含科学。

我正在使用

if (strpos($dir, "ComputerScience") !== FALSE) {
    $my_full_path= $dir;
    $sql = "UPDATE documents 
                SET subject = 'ComputerScience' 
            WHERE documentname='".$dir."'";
    mysqli_query($link,$sql);
}

if (strpos($dir, "Science") !== FALSE) {
    $my_full_path= $dir;
    $sql = "UPDATE documents 
                SET subject = 'Science' 
            WHERE documentname='".$dir."'";
    mysqli_query($link,$sql);
}

我猜第二个代码块正在覆盖第一个被匹配的代码块,如果 $dir 变量包含它,我如何对字符串进行精确匹配?

谢谢

【问题讨论】:

标签: php string match


【解决方案1】:

理想情况下,您应该添加目录分隔符以避免这些问题:

if (strpos($dir, "/ComputerScience/") !== FALSE) {
}
if (strpos($dir, "/Science/") !== FALSE) {
}

/ 替换为文件系统的实际目录分隔符(\/)。

【讨论】:

  • @Salaman A 有一个常量 DIRECTORY_SEPARATOR 定义操作系统目录分隔符
  • @robert 但它可能与数据库中存储的不同。例如。在 Windows 上它是 \ 但该列可能存储使用 / 的 URL。
  • 这就是为什么 dev env 应该与 prod 中的相同(它是 docker)
【解决方案2】:
$subject = FALSE !== strpos($dir, "ComputerScience") ? 'ComputerScience' : (FALSE !== strpos($dir, "Science") ? 'Science' : null);

if (null !== $subject) {
    $my_full_path= $dir;
    $sql = "UPDATE documents 
                SET subject = '$subject' 
            WHERE documentname='".$dir."'";
    mysqli_query($link,$sql);
}

使用准备好的语句也很好。他们指出,上面的代码减少了样板代码,因为您不需要编写类似的代码来执行两次查询。如果解决方案可以像@Salman A 那样做同样的事情。这只是三元运算符的另一种选择。

【讨论】:

    【解决方案3】:

    如果您要匹配子字符串,您应该始终优先查找较长的匹配项而不是较短的匹配项:

    if (strpos($dir, "ComputerScience") !== FALSE) {
        $sql = "UPDATE documents 
                    SET subject = 'ComputerScience' 
                WHERE documentname='".$dir."'";
        mysqli_query($link,$sql);
    } elseif (strpos($dir, "Science") !== FALSE) {
        $sql = "UPDATE documents 
                    SET subject = 'Science' 
                WHERE documentname='".$dir."'";
        mysqli_query($link,$sql);
    }
    

    您可以通过先将匹配项存储在数组中来缩短代码:

    $matches = ['ComputerScience', 'Science'];
    foreach ($matches as $match) {
        if (strpos($dir, $match) !== FALSE) {
            $sql = "UPDATE documents 
                        SET subject = '$match' 
                    WHERE documentname='$dir' ";
            mysqli_query($link, $sql);
            break;
        }
    }
    

    同样,较长的匹配项在数组中排在第一位。您还可以使用字符串插值来使 SQL 更易于阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多