Регулярные выражения PHP (номер телефона)

#php #javascript #regex

#php #javascript #регулярное выражение

Вопрос:

У меня возникли некоторые проблемы с регулярным выражением для телефонных номеров. Я пытаюсь создать регулярное выражение, которое было бы как можно более широким для европейских телефонных номеров. Номер телефона может начинаться с или с двух ведущих нулей, за которыми следует число от 0 до 40. однако в этом нет необходимости, поэтому эту первую часть также можно игнорировать. После этого все это должны быть числа, сгруппированные в пары не менее чем по два, с пробелом или символом — между группами.

Регулярное выражение, которое я собрал, можно найти ниже.

 /(( |00) [0-4] [0-9] )?([ -]?[0-9]{2,15}){1,5}/
 

Это должно соответствовать следующим структурам

 0031 34-56-78
0032123456789
0033 123 456 789
0034-123-456-789

 35 34-56-78
 36123456789
 37 123 456 789
 38-123-456-789
...
 

Чему это также соответствует в соответствии с моим javascript

  32 a54b 67-0:
 

Так что, должно быть, я где-то допустил ошибку, но я действительно этого не вижу. Любая помощь будет признательна.

Комментарии:

1. Просто небольшое примечание: вы используете в тех местах, где имеете в виду «одно вхождение». однако означает «по крайней мере один». Таким образом, вы можете рассмотреть возможность удаления всех в первой части регулярного выражения, поскольку каждая отдельная группа там должна встречаться ровно один раз, и ? тогда следующее сделает все это необязательным.

2. Используйте s вместо прямого ввода пробелов

3. Это то [0-9]{2,15} , что соответствует, первая часть регулярного выражения необязательна. Как говорится в ответах, вы хотели ограничить совпадение со всей строкой (утверждения начала конца).

4. Номера в ЕС начинаются с 3 или 4 (за исключением Фарерских островов (298) и Гренландии (299)), а некоторые страны получили 3 номера в префиксе для кода страны, поэтому я немного расширил регулярное выражение и сделал так, чтобы в нем было только 2 группы захвата (префикс и номер) ^((?:00| )(?:[34][0-9]{1,2}|298|299))?[ -]?((?:[0-9]{2,15}[ -]?){1,5})$

5. вот пример: if (ereg ("^((?:00| )(?:[34][0-9]{1,2}|298|299))?[ -]?((?:[0-9]{2,15}[ -]?){1,5})$", $var, $regs)) { $countrycode = $regs[1]; $number = $regs[2]; } (извините, это плохо смотрится в комментариях)

Ответ №1:

Проблема в том, что вы не используете якоря ^ $ для определения начала и конца строки и поэтому найдете совпадение в любом месте строки.

 /^(( |00) [0-4] [0-9] )?([ -]?[0-9]{2,15}){1,5}$/
 

Добавление якорей сделает свое дело. Подробнее об этих мета-символах можно найти здесь .

Комментарии:

1. Спасибо, это помогло, и ссылка также помогла мне понять это 🙂

Ответ №2:

Попробуйте это, может быть, вам поможет.

 if (ereg("^((([0-9]{3}) ?)|([0-9]{3}-))?[0-9]{3}-[0-9]{4}$",$var)) 
{
    $valid = true; 
}
 

Ответ №3:

Поместите ^ в начало регулярного выражения и $ в конец.