我想在PHP中创建一个正则表达式,允许用户输入下面任何一种格式的电话号码。
345-234 898
345 234-898
235-123-456
548 812 346
最小长度应为7,最大长度应为12。
问题在于,正则表达式并不关心最小和最大长度。我不知道它有什么问题。请帮我解决一下。这是正则表达式。
if (preg_match("/^([0-9]+((\s?|-?)[0-9]+)*){7,12}$/", $string)) {
echo "ok";
} else {
echo "not ok";
}
感谢您阅读我的问题。我会等待回复。
答案 0 :(得分:2)
只需这样做:
if (preg_match("/^\d{3}[ -]\d{3}[ -]\d{3}$/", $string)) {
此处\d
表示来自0-9
的任何数字。此外[ -]
表示空格或连字符
答案 1 :(得分:2)
您可以使用preg_replace去除非数字符号并检查结果字符串的长度。
$onlyDigits = preg_replace('/\\D/', '', $string);
$length = strlen($onlyDigits);
if ($length < 7 OR $length > 12)
echo "not ok";
else
echo "ok";
答案 2 :(得分:2)
您应该在模式上使用开始(^)和结束($)符号
$subject = "123456789";
$pattern = '/^[0-9]{7,9}$/i';
if(preg_match($pattern, $subject)){
echo 'matched';
}else{
echo 'not matched';
}
答案 3 :(得分:1)
您可以在模式开头使用前瞻断言(?=...)
检查长度:
/^(?=.{7,12}$)[0-9]+(?:[\s-]?[0-9]+)*$/
答案 4 :(得分:0)
分解原始正则表达式,它可以如下所示:
^ # start of input
(
[0-9]+ # any number, 1 or more times
(
(\s?|-?) # a space, or a dash.. maybe
[0-9]+ # any number, 1 or more times
)* # repeat group 0 or more times
)
{7,12} # repeat full group 7 to 12 times
$ # end of input
所以,基本上,你允许“任意数量,1次或更多次”,然后是“任意数量1次或更多次,0次或更多次”重复“7到12次” - 这种杀戮你的长度检查。
您可以采取更有限的方法并写出每个单独的数字块:
(
\d{3} # any 3 numbers
(?:[ ]+|-)? # any (optional) spaces or a hyphen
\d{3} # any 3 numbers
(?:[ ]+|-)? # any (optional) spaces or a hyphen
\d{3} # any 3 numbers
)
简化为:
if (preg_match('/^(\d{3}(?:[ ]+|-)?\d{3}(?:[ ]+|-)?\d{3})$/', $string)) {
如果要将分隔符限制为单个空格或连字符,则可以更新正则表达式以使用[ -]
而不是(?:[ ]+|-)
;如果您希望这是“可选”(即数字组之间不能有分隔符),请在每个数字组的末尾加?
。
if (preg_match('/^(\d{3}[ -]\d{3}[ -]\d{3})$/', $string)) {