2016-07-05 5 views
7

Yalnızca bir dizeden ABD telefon numaralarını ayıklamaya çalışıyorum.Bir dizeden ABD telefon numaralarını ayıkla

Web/SO etrafına baktım ama ihtiyaçlarım için uygun bir çözüm bulamadım.

Dürüst olmak gerekirse, Web Programlama konusunda 2,5 yıllık bir deneyime sahibim, ancak RegEX'de emiyorum. İşte

Ben

(\d{3}+\-\d{3}+\-\d{4}+) yazdığım tek Regex ama sadece burada

589-845-2889 Ben ayıklamak istediğiniz telefon numaraları tespit eder.

589-845-2889 

(589)-845-2889 

589.845.2889 

589 845 2889 

5898452889 

(589) 845 2889 

Ben PHP tek Regex bu ustalığı nasıl elde edebileceğini söyle.

DÜZENLEME: Bir kullanıcı girebilirsiniz ABD numarasının başka biçimi hissederseniz

, ayrıca bunu da belirtmek ve bu Regex yanı bulunmaktadır.

P.S.:

Aslında Craiglist kazımak çalışıyorum ve kullanıcı olası bir formatta kendi telefon numarasını arka olabilir.

+0

589 845-2889' bir eşleşme olmalı mı? – anubhava

+0

Evet, bir kullanıcının kendi numarasını girebileceği olası bir yol – Umair

+1

Olası kopyası [Telefon numarası doğrulaması için kapsamlı bir normal ifade] (http://stackoverflow.com/questions/123559/a-comprehensive-regex-for-phone-number- doğrulama) – hugomg

cevap

2

test Eğer conditional subpatterns dayanarak bu normal ifadeler kullanabilirsiniz:

(\()?\d{3}(?(1)\))[-.\h]?\d{3}[-.\h]?\d{4} 

RegEx Demo

  • (\()? maçlar ( opsiyonel ve grup # bunu yakalar 1
  • (?(1)\)) grubu # 1 ( maçın soldaki mevcuttur, yani boş değil yalnızca ) kapanış maçlarının koşullu desen olduğunu.
+0

Neden garip bir sonucu var? http://sandbox.onlinephpfunctions.com/code/b3b6cf795b8026c85d5c9bbdc04943978e94e8d0 – Umair

+0

Yani, 2 dizi döndürür, 1. dizi iyi, 2. dizi ne hakkındadır? – Umair

+0

Sonuçlarınız için 'var_dump ($ result [0]);' kullanmalısınız. [Bu demosunu şimdi kontrol et] (http://sandbox.onlinephpfunctions.com/code/1cc85f77cb46becf28711e9162c8ea601d752375) – anubhava

1

Son olarak, çalışır:

^(\((\d{3})\)|(\d{3}))[\s\-\.]?\d{3}[\s\-\.]?\d{4} 

not defteri ++ PHP (PCRE'nin) olarak