Preg_matching электронной почты и ищет конкретный текст - PullRequest
0 голосов
/ 18 мая 2018

У меня есть куча электронных писем, которые я читаю как текстовые в моей программе, и у них всех есть номера телефонов, такие как эти:

+370 655 54298
+37065782505
37069788505
865782825
65782825
(686) 51852

Как мне найти их и сохранить в переменной?

Пока я делаю это так:

$found = preg_match('^[0-9\-\+]{9,15}^', $text, $num);

Но это не работает вообще

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Здесь мы различаем 3 типа телефонных номеров.

Первый тип:

+37065782505
37069788505
865782825
65782825

Здесь начало + необязательно.поэтому мы считаем, что у нас есть минимум 7 цифр для этих чисел.

Таким образом, получено регулярное выражение

(\+?[0-9]{7,})

Второй тип:

+370 655 54298

Здесь у нас есть первый блок, состоящий из +, за которым следуют от 2 до 6 цифр, а затем несколько других блоков из 2-6 цифр, разделенных пробелами.

Таким образом, получается регулярное выражение

(\+[0-9]{2,6}(\s[0-9]{2,6})+)

Последний тип:

(686) 51852

Это первый блок, состоящий из 2-6 цифр, заключенных в круглые скобки, а затем несколько других блоков из 2-6 цифр, разделенных пробелами.

Таким образом, получается регулярное выражение

(\([0-9]{2,6}\)(\s[0-9]{2,6})+)

Полный код извлечения, следовательно,

preg_match_all("#(\+?[0-9]{7,})|(\+[0-9]{2,6}(\s[0-9]{2,6})+)|(\([0-9]{2,6}\)(\s[0-9]{2,6})+)#",$text,$out);
$found = $out[0];

, где $found - массив.

0 голосов
/ 18 мая 2018

Посмотрите " libphonenumber " в библиотеке Google.

Существуют две функции, которые могут оказаться полезными

  • isPossibleNumber - быстрое определение, является ли число возможным телефонным номером, используя только информацию о длине, намного быстрее, чем полная проверка.
  • isValidNumber - полная проверка номера телефона для региона с использованием информации о длине и префиксе.
0 голосов
/ 18 мая 2018

Это должно работать https://regex101.com/r/E2PzRN/2

#\+?\(?\d+\)?\s?\d+\s?\d+#

<?php

$regex = '#\+?\(?\d+\)?\s?\d+\s?\d+#';
$x = [
    '+370 655 54298',
    '+37065782505',
    '37069788505',
    '865782825',
    'hjtgfjtdfjtgdfjt',
    '65782825',
    '(686) 51852',    
];

foreach ($x as $y) {
    if (preg_match($regex, $y, $match)) {
        echo $match[0] . "\n";
    }
}

Проверьте это в действии здесь https://3v4l.org/6AlQa

0 голосов
/ 18 мая 2018

Я бы предложил убрать '+', '(', ')', '' и проверить, если это ctype_digit

удалить все символы и проверить, если числовое, это предполагает, что результатномер телефона, если вы запустите это на адрес электронной почты, результат будет ложным

 var_dump(ctype_digit(str_replace([' ', '+', '(', ')'], '', '(686) 51852')));

TRUE

 var_dump(ctype_digit(str_replace([' ', '+', '(', ')'], '', 'r@pm.mr')));

ЛОЖЬ

...