用于完全一个或两个单词匹配的mysql正则表达式

时间:2017-09-24 13:55:26

标签: php mysql regex

我打算使用以下代码显示100个汽车品牌的一些销售数字:

$brand = str_replace ('-', '[- ]', $_GET['brand']);

$sql = "SELECT year, brand, number FROM `exampletable` WHERE brand REGEXP :brand ORDER BY `year` DESC";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":brand", $brand);
$stmt->execute();
if($stmt->rowCount())
{ while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
?>
<?php echo $result['year'];?>
<?php echo $result['number'];?>

<?php }} else { echo '0'; } ?>

现在这个代码适用于我桌上的98个品牌,但是以下品牌存在问题,因为它们包含相同的字词:

  • &#34;雷诺&#34;和#34; Matra Renault&#34;
  • &#34;大众&#34;和#34;大众保时捷&#34;

因此,&#34; Matra Renault&#34;不仅会出现在该品牌的特定网页上,还会出现在&#34;雷诺&#34;的网页上。同样的事情发生在&#34;大众汽车&#34;我在哪里看到#34;大众保时捷&#34;同样。

所以,我完全理解为什么我的代码不起作用,但我对这个主题没有足够的知识来寻找快速的解决方案。我已经在这里阅读了较旧的问题,但似乎没有人讨论同样的问题。

注意:由于将来我的表中不会添加其他数据,因此专门针对上述品牌的解决方案就足够了。

1 个答案:

答案 0 :(得分:2)

问题是您选择了REGEXP,而您显然不需要它。正则表达式意味着Volkswagen将匹配品牌名称中Volkswagen的任何内容,因此您可以获得其他不需要的结果,特别是因为您的正则表达式只是整个品牌名称。

注意,顺便提一下,搜索Volkswagen Porsche不会返回Volkswagen,因为Porsche不在其中。请参阅this simplified example vs this

问题的解决方案是只需使用=选择您要查找的品牌的确切名称:

$sql = "SELECT year, brand, number FROM `exampletable` WHERE brand = :brand ORDER BY `year` DESC";

另一个解决方案,虽然完全矫枉过正,但是要修正你的正则表达式以完全匹配单词:

$brand = "^".$brand."\$";

然后,它只会查找完全匹配。 See example