PHP-麻烦匹配变量中的字符串

时间:2019-01-16 14:16:03

标签: php string match

我有一个文件夹结构,两个文件夹分别命名为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变量包含该字符串,我该如何精确匹配该字符串?

谢谢

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

$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相同,则可以执行相同的操作。这只是三元运算符的另一种选择。

答案 2 :(得分:0)

如果要匹配子字符串,则应始终寻找较长的匹配项,而不是较短的匹配项:

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易于阅读。