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
的模式。大多数时候你真的不想要那个换行符。
我正在尝试构建一个检查来可靠地评估输入 ($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
的模式。大多数时候你真的不想要那个换行符。