Окончательный способ найти номера телефонов в строке PHP с preg_replace

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

Номера телефонов могут быть в разных форматах и ​​иметь разные тексты до и после них. Есть ли какой-либо простой способ обнаружения всех видов телефонных номеров? Некоторая библиотека, которую можно использовать?

Телефонные номера могут отображаться как, должны работать со всеми этими комбинациями. Чтобы результат был подобен

<a href="tel:number">number</a>

+61 8 9000 7911

+2783 207 5008

+ 82-2-806-0001

+56 (2) 509 69 00

+44 (0) 1625 500125

+1 (305) 409 0703

031-704 98 00

+46 31 708 50 60

Не уверен, что для этого есть библиотека. Хммм. Как и любые международные удобства, номера телефонов стандартизированы, и также должен быть формат, определяющий номера телефонов. В E.164 предлагаются рекомендуемые номера телефонов: http://en.wikipedia.org/wiki/E.164 . Все библиотеки декодирования с открытым исходным кодом построены на основе чтения этих стандартных форматов, поэтому это должно помочь, если вы действительно не можете найти существующие библиотеки

Возможно, что-то вроде этого:

 /(\+\d+)?\s*(\(\d+\))?([\s-]?\d+)+/ 
  • (\+\d+)? = A "+", за которым следует одна или несколько цифр (необязательно)
  • \s* = любое количество символов пробела (необязательно)
  • (\(\d+\))? = A "(" за которым следует одна или несколько цифр, за которыми следует ")" (необязательно)
  • ([\s-]?\d+)+ = Один или несколько наборов цифр, необязательно предшествующих пробелу или тире

Честно говоря, я сомневаюсь, что вы найдете одно-выражение-правило-все-все. Телефонные номера могут быть в разных форматах, что, вероятно, нецелесообразно сопоставлять любой возможный формат без ложных срабатываний или негативов.

Думаю, это может сделать это для этих случаев?

 preg_replace("/(\+?[\d-\(\)\s]{7,}?\d)/", '<a href="tel:$1">number</a>', $str); 

В основном я проверяю, может ли он начинаться с +. Это не обязательно. Затем я проверяю, получили ли он номера, -, (,) и пробелы с не менее чем 8 случаями, поэтому он не выбирает низкие номера без номера.

Попробуйте следующее:

 preg_match_all('/\+?[0-9][\d-\()-\s+]{5,12}[1-9]/', $text, $matches); 

или:

 preg_match_all('/(\+?[\d-\(\)\s]{8,20}[0-9]?\d)/', $text, $matches);