#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:
Поместите ^
в начало регулярного выражения и $
в конец.