1

我正在尝试建立一个检查,通过正则表达式可靠地评估输入 ($f_username) 是否是 MAC 地址,因为它可能需要不同的语法。找到匹配项后。这应该在没有分隔符的情况下转换为小写。

该函数在匹配和转换大多数输入时工作正常,但会错误地匹配更长的输入......例如 11-22-33-44-55-66-77-88 将被转移到 11-22-33-44-55- 66 并且 $match 设置为 true...

这应该导致函数转到“其他分支”,因为它不是模式的完全匹配......但是它包含一个匹配......有人知道如何正确匹配这个吗?

感谢您抽出宝贵时间阅读本文,并提前感谢您的任何答案:)

function username_check($f_username) {
  global $match;
  if (preg_match_all("/([0-9a-fA-F]{2})[^0-9a-fA-F]?([0-9a-fA-F]{2})[^0-9a-fA-F]?([0-9a-fA-F]{2})[^0-9a-fA-F]?([0-9a-fA-F]{2})[^0-9a-fA-F]?([0-9a-fA-F]{2})[^0-9a-fA-F]?([0-9a-fA-F]{2})/", $f_username, $output, PREG_PATTERN_ORDER)) {
    for ($i = 1; $i <= 6; $i++) {
      $new_username .= strtolower($output[$i][0]);
    }
    $match = true;
    $new_username = "'" . $new_username . "'"; //for later use in SQL-Query
  } else {
    $match = false;
  }
  return $new_username;
}
4

1 回答 1

1

我建议使用此答案中的 RegEx,因为它可以确保格式正确的 MAC 地址。如果要在分隔符列表中添加空格,只需将其替换[-:]为 this [: -]

您遇到了您描述的问题,因为您没有将 RegEx 绑定到字符串的开头或结尾。这意味着只要字符串中某处有匹配项,它就是有效匹配项。
要将其绑定到字符串的开头,请^在开始分隔符之后使用。要将其绑定在字符串的末尾,我建议 *\z在结束分隔符之前使用。

* 我在 PHP 中推荐\zover的原因$是因为后者将允许在匹配后换行。这意味着该字符串"testing\n"将匹配与 绑定的模式$,但不会与绑定的模式匹配\z。大多数时候你真的不想要那个换行符。

于 2015-07-14T16:17:49.683 回答