PHP 输入和正则表达式模式完全匹配

PHP exact match between input and regex pattern

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

该函数可以很好地匹配和转换大多数输入,但会错误地匹配较长的输入... 例如11-22-33-44-55-66-77-88 将被转移到 11-22-33-44-55-66 并且 $match 设置为 true...

这应该会导致函数转到 "else branch",因为它不是模式的完全匹配...但是它包含匹配...有没有人知道如何正确匹配它?

感谢您花时间阅读本文,并提前感谢您的任何答复:)

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;
}

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

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

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