【问题标题】:SQL query using regex with string containing dashes使用正则表达式和包含破折号的字符串的 SQL 查询
【发布时间】:2014-03-15 17:50:18
【问题描述】:

我正在尝试比较标题,它来自包含破折号的 URL 字符串,例如:

Learning-Programming-Together-With-StackOverflow

我的 DB 记录 有:

Learning Programming Together With StackOverflow

Learning-Programming Together With StackOverflow

现在,我不确定 如何/哪个 regex 与 SQL 查询一起使用,以匹配我上面的 DB 记录。 因此,当我提供带有破折号的 URL 字符串 时,SQL 正则表达式查询会是什么样子以匹配
我的 DB 记录

我正在考虑尝试以下 SQL 查询:

$sql = $this->db->conn->prepare("
    SELECT
      title
    FROM
      video
    WHERE
      title REGEXP :title 
    LIMIT 1
    ");
$sql->execute( array(
    ':title' => $title,
) );

但我完全不确定如何将它与匹配破折号的regex /([-])/g 结合起来?

有什么帮助/建议吗?

【问题讨论】:

    标签: php mysql sql regex


    【解决方案1】:

    为什么不

    $sql = $this->db->conn->prepare("
        SELECT
          title
        FROM
          video
        WHERE
          REPLACE(title, ' ', '-') = REPLACE(:title, ' ', '-')
        LIMIT 1
        ");
    $sql->execute( array(
        ':title' => $title,
        ) );
    

    或者$title可以在php中完成替换。

    【讨论】:

    • 谢谢,:) 但有时,标题可能包含破折号/破折号,如上面的示例 - Learning-Programming Together With StackOverflow。你的例子不会明白这一点,对吧?
    • 是的。 Learning-Programming Together With StackOverflow 变为 Learning-Programming-Together-With-StackOverflow。也比正则表达式更快。
    • 所以你相信它会匹配两个数据库记录:Learning Programming Together With StackOverflowLearning-Programming Together With StackOverflow 甚至Learning Programming Together With-StackOverflow
    • 哦,是的,你是对的,非常感谢你,我的朋友!它就像你举例的那样工作!
    • 是的,您需要添加单引号。 REPLACE(title, '" . $var1 . "', '" . $var2 . "')
    【解决方案2】:

    您可以在向 MySQL 查询提供字符串之前应用 preg_replace

    ':title' => preg_replace('/[ -]+/', '', $title),
    

    并在您的查询中使用它:

    REPLACE(REPLACE(title, ' ', ''), '-', '')
    

    基本想法是在比较之前从两侧删除所有连字符和空格。

    【讨论】:

    • 谢谢,但我必须使用foreach 循环,因为有时它可能包含破折号?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多