Reputation: 21271
I am trying to extract US only phone numbers from a string.
I have looked around the web/SO but have not found any suitable solution for my needs.
To be honest, I have 2.5 years of experience in Web Programming but I suck at RegEX.
Here is only RegEX I wrote (\d{3}+\-\d{3}+\-\d{4}+)
but it only detects 589-845-2889
Here are phone numbers I want to extract.
589-845-2889
(589)-845-2889
589.845.2889
589 845 2889
5898452889
(589) 845 2889
Please tell me how can I achieve this feat in single Regex for PHP.
EDIT:
If you feel any other format of US number a user can enter, also mention that as well, and include that in RegEX as well.
P.S:
Actually I am trying to scrape Craiglist and user may have posted their phone number in any possible format.
Upvotes: 7
Views: 491
Reputation: 785531
In PHP (PCRE) you can use this regex based on conditional subpatterns:
(\()?\d{3}(?(1)\))[-.\h]?\d{3}[-.\h]?\d{4}
(\()?
matches optional (
and captures it in group #1(?(1)\))
is conditional pattern that matches closing )
only if group #1 is not null i.e. (
is present on left of the match.Upvotes: 2
Reputation: 618
Finally, it works:
^(\((\d{3})\)|(\d{3}))[\s\-\.]?\d{3}[\s\-\.]?\d{4}
tested in notepad++
Upvotes: 1