【问题标题】:How would I compare these types of strings?我将如何比较这些类型的字符串?
【发布时间】:2013-03-29 04:35:07
【问题描述】:

我有一个脚本,允许用户提交搜索查询,通常采用站点名称的形式或使用设备的 MAC 地址。我想让搜索尽可能简单,所以只需要一个搜索字段,并且不想用选择字段或单选按钮将其弄乱,以便用户指定他们正在搜索的内容。我想在后端自动处理。

以下是我希望以下列格式之一搜索站点名称的方式:

字母和数字只是例子,可以是任何东西,只要是这种格式。

TX-DAL0099A1
TX-DAL0099A
TX-DAL0099
DAL0099A1
DAL0099A
DAL0099

或按 MAC 地址

00 11 22 33 44 55
00:11:22:33:44:55
00.11.22.33.44.55
00-11-22-33-44-55
001122334455

我正在寻找最好的方法来首先检查它是否是站点名称(第一个示例),然后如果不是,请确保它是 MAC 地址。我不想在搜索查询上运行 preg_replace 函数来去除任何杂项字符,如连字符、句点、冒号等,因为拥有站点名称的前缀 TX- 部分很重要 - 如果它实际上是正在搜索的站点名称。

注意:我需要知道站点名称是否有前缀,以及示例中的结尾 A/A1。这些很重要。

我希望这是有道理的。 =/

哦,我正在用 PHP 做这个 - 忘了提。

更新:这段代码 sn-p 可以工作吗?

if(preg_match("/^([0-9A-F]{2}[:-\s]?){5}([0-9A-F]{2})$/", $input)) {
    // SEARCH IS A MAC ADDRESS
}
else if((($query = $mysqli->query("SELECT * FROM `table` WHERE `site` LIKE '%$input%'")) !== false) && $query->num_rows() > 0) {
    // SEARCH IS A SITE AND FOUND ROW IN DATABASE
}
else {
    // NEITHER SITE NOR MAC, OR COULDN'T BE FOUND
}

【问题讨论】:

  • 请注意,上面的正则表达式也将接受以下 mac 地址 0F-A0-FF:86 DE 84,pilcow 在stackoverflow.com/questions/4260467/… 上给出的正则表达式应该会更好
  • 感谢您的提示,bkwint。

标签: php string forms string-comparison


【解决方案1】:

这里有一些可以提供帮助的 sn-ps。

查看我们是否有 MAC 地址(从What is a regular expression for a MAC Address? 获取(和调整)正则表达式模式):

if(preg_match("/^([0-9A-F]{2}[:-\s]?){5}([0-9A-F]{2})$/", $input)) {
   // We have a MAC address
}

看看我们在输入中是否有破折号(表示前缀)以及它是什么:

$siteNamePieces = explode("-",$input);
if(count($siteNamePieces) >= 2) {
   // Site name has a prefix, and it is $siteNamePieces[0]
}

看看我们是以 A 还是 A1 结尾:

if(substr($input, -1) == "A") {
   // Ends in A
} else if(substr($input, -2) == "A1") {
   // Ends in A1
}

我希望这些将需要根据您正在寻找的不同类型的结尾进行调整,是否可以出现破折号而不一定意味着它是前缀等。我猜您需要取消前缀和结束并获取用于查询的核心站点名称值。

一旦您知道您正在处理什么样的数据(mac 地址、站点名称),您就可以适当地查询您的数据库。

希望这些能让你朝着正确的方向前进!

【讨论】:

  • 谢谢!第一个对我特别有帮助。我使用您和 Codeius 的示例更新了我的原始问题,将我认为可能有用的东西放在一起。你能检查一下它是否有任何潜在的问题?
【解决方案2】:

下面的 SQL 查询将查找 site 与输入相似的行,或者 mac 正是输入。

SELECT * FROM `table` WHERE `site` LIKE '%$input%' OR `mac` = '$input';

【讨论】:

  • 这是一种可能性。但是,目前,我的数据存储在文本文件中。我正在慢慢迁移到数据库后端,但是要处理的条目远远超过 100,000 个,而且我还没有完全开始导入它们......以及所有这些。但是,我有一个问题,如果有人搜索“TX-DAL0091A1”会匹配一个简单的条目,例如“DAL0091”或“DAL0091A”吗?我假设这就是 LIKE 参数的作用,但我只是想确定一下。然后我猜它会回到 MAC,如果从 LIKE 搜索中找不到任何东西,对吧?抱歉这些问题。
  • 嗯,是的,它将匹配 DAL0091 和 DAL0091A,百分比字符定义模糊部分。该查询将匹配所有类似于站点的内容(如上),以及与 mac 相同的所有内容。您可能会在上述查询中收到多个响应。
  • 谢谢!我使用您和 jszobody 的示例更新了我的原始问题,将我认为可能有用的东西放在一起。你能检查一下它是否有任何潜在的问题?
  • 如果你想在 PHP 字符串上使用 LIKE 语法,我 once created in an answer a function that converts the LIKE syntax into a pcre regex 的问题 Wildcards in array search - 它可能对你有用。
【解决方案3】:

你可以试试 variable1 ==== varaible2

它将字符串与数据类型进行比较,因为它具有三个等号字符 否则它只会比较值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多