472,805 Members | 1,232 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,805 software developers and data experts.

PHP Pattern Matching - Is there a better solution?

One of my weaknesses has always been pattern matching. Something I
definitely need to study up on and maybe you guys can give me a pointer
here.

I'm looking to remove all of this code and just use pattern matching to
determine if the proper amount of numeric characters has been met. Here is
the function I've already done. Any help you can give in a pattern matching
solution would be much appreciated and very educational.
//the $area option is for determining if the user need (or need not) type in
their area code.

function check_phone($phone,$area='y'){
if($area=='y'){
$min=10;
} else {
$min=7;
}

//is there a more direct approach to just count the amount of numbers in
the string by pattern matching?
$phone=str_replace('-','',$phone);
$phone=str_replace('(','',$phone);
$phone=str_replace(')','',$phone);
$phone=str_replace(' ','',$phone);

if(!preg_match('/[\d]{'.$min.',}/',$phone)){
return(FALSE);
} else {
return(TRUE);
}
}
Jul 17 '05 #1
8 6905
.oO(gsv2com)
//is there a more direct approach to just count the amount of numbers in
the string by pattern matching?
$phone=str_replace('-','',$phone);
$phone=str_replace('(','',$phone);
$phone=str_replace(')','',$phone);
$phone=str_replace(' ','',$phone);

if(!preg_match('/[\d]{'.$min.',}/',$phone)){
return(FALSE);
} else {
return(TRUE);
}
}


I would simply remove all the special chars and then check the length of
the remaining string, no need for pattern matching here:

function check_phone($phone, $area = TRUE) {
$min = $area ? 10 : 7;
return strlen(str_replace(array('-', '(', ')', ' '), '', $phone)) >= $min;
}

HTH
Micha
Jul 17 '05 #2
Regular expression is definitely something that's worth spending the
time mastering. In this case it's not strictly necessary. But for more
complex validation, it'll makes your life a whole lot easier.

Here's the pattern, built in pieces for educational purpose:

$pattern = '';

// the beginning of the string
$pattern .= '^';

// 0 or more white spaces (just in case)
$pattern .= '\s*';
if($area) {
// optional open paren
$pattern .= '\(?';

// capturing 3 digits
$pattern .= '(\d{3})';

// optional close paren
$pattern .= '\)';

// optional dash, or space
$pattern .= '[\- ]?';
}

// capturing next 3 digits
$pattern .= '(\d{3})';

// optional dash or space
$pattern .= '[\- ]?';

// capturing 4 digits
$pattern .= '(\d{4})';

// 0 or more white spaces
$pattern .= '\s*';

// end of string
$pattern .= '$';

// altogether >> '^\s*\(?(\d{3})\)?[\- ]?(\d{3})[\- ]?(\d{4})\s*$'
if(preg_match("/$pattern/", $phone, $matches)) {
...
}

Jul 17 '05 #3
gsv2com wrote:
One of my weaknesses has always been pattern matching. Something I
definitely need to study up on and maybe you guys can give me a pointer
here.

I'm looking to remove all of this code and just use pattern matching to
determine if the proper amount of numeric characters has been met. Here is
the function I've already done. Any help you can give in a pattern matching
solution would be much appreciated and very educational.


function check_phone($phone,$area='y'){
if($area=='y'){
$min=10;
} else {
$min=7;
}
// remove any non-digit from the string
$phone=preg_replace('/[^0-9]/','',$phone);

return (strlen($phone)==$min)? TRUE : FALSE;
}

Just be careful what you pass for the $area value. If you call:

check_phone($phone,0);

You *will* need the area code. (string to int conversion in if statement).

--
Justin Koivisto - ju****@koivi.com
http://www.koivi.com
Jul 17 '05 #4
ch***********@hotmail.com wrote:
Regular expression is definitely something that's worth spending the
time mastering. In this case it's not strictly necessary. But for more
complex validation, it'll makes your life a whole lot easier.

Here's the pattern, built in pieces for educational purpose:

$pattern = '';

// the beginning of the string
$pattern .= '^';

// 0 or more white spaces (just in case)
$pattern .= '\s*';
if($area) {
// optional open paren
$pattern .= '\(?';

// capturing 3 digits
$pattern .= '(\d{3})';

// optional close paren
$pattern .= '\)';
That isn't optional... this is ;)
$pattern .= '\)?';
// optional dash, or space
$pattern .= '[\- ]?';
}

// capturing next 3 digits
$pattern .= '(\d{3})';

// optional dash or space
$pattern .= '[\- ]?';

// capturing 4 digits
$pattern .= '(\d{4})';

// 0 or more white spaces
$pattern .= '\s*';

// end of string
$pattern .= '$';

// altogether >> '^\s*\(?(\d{3})\)?[\- ]?(\d{3})[\- ]?(\d{4})\s*$'
if(preg_match("/$pattern/", $phone, $matches)) {
...
}


Hmm.. might want to make that a bit more generic. I've seen users
delimit phone number parts with characters other than a - or space (like
a dot, long hyphen, comma, etc.).

Maybe better would be something like this:

^[^\d]*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})[^\d]*$

Of course, you could just remove all the non-digits:
$phone=preg_replace('/[^\d]/','',$phone);

Then simply compare the length of the string.

--
Justin Koivisto - ju****@koivi.com
http://www.koivi.com
Jul 17 '05 #5
Thanks for your help guys. As the end result, I used a combination of a few
of your tips to make the finalized function:

function check_phone($phone,$area=TRUE){
$min = $area ? 10 : 7;
$phone=preg_replace('/[^0-9]/','',$phone);
return (strlen($phone)==$min)? TRUE : FALSE;
}

Very nice. Thanks again.
Jul 17 '05 #6
.oO(gsv2com)
function check_phone($phone,$area=TRUE){
$min = $area ? 10 : 7;
$phone=preg_replace('/[^0-9]/','',$phone);
return (strlen($phone)==$min)? TRUE : FALSE;
}


JFTR: It's not necessary to explicitly return TRUE or FALSE in this
case. It's redundant because the result of the comparision will already
be of type boolean:

return strlen($phone) == $min;

does the same without another unnecessary operation.

In the preg_replace() pattern you could also use the character class \d
(digits) instead of 0-9:

'/[^\d]/'

And another thing: Are you sure the numbers will always exactly be 7 or
10 digits long? At least here in Germany the length of phone numbers may
vary. That's why I used >= instead of == in my example and your first
code also suggested that.

Micha
Jul 17 '05 #7
Michael Fesser wrote:
.oO(gsv2com)

function check_phone($phone,$area=TRUE){
$min = $area ? 10 : 7;
$phone=preg_replace('/[^0-9]/','',$phone);
return (strlen($phone)==$min)? TRUE : FALSE;
}


JFTR: It's not necessary to explicitly return TRUE or FALSE in this
case. It's redundant because the result of the comparision will already
be of type boolean:

return strlen($phone) == $min;

does the same without another unnecessary operation.


I usually include the explicit returns just for readability sake. ;)

--
Justin Koivisto - ju****@koivi.com
http://www.koivi.com
Jul 17 '05 #8
gsv2com wrote:
One of my weaknesses has always been pattern matching.


<snip>

Perhaps you should try <http://www.weitz.de/regex-coach/>

--
<?php echo 'Just another PHP saint'; ?>
Email: rrjanbiah-at-Y!com Blog: http://rajeshanbiah.blogspot.com/

Jul 17 '05 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: NimP | last post by:
Hi,. I'm trying to detect any links that are contained within an html page using eregi pattern matching. I was wondering if there are any pattern matching geniuses out there who could write a...
176
by: Thomas Reichelt | last post by:
Moin, short question: is there any language combining the syntax, flexibility and great programming experience of Python with static typing? Is there a project to add static typing to Python? ...
2
by: ahogue at theory dot lcs dot mit dot edu | last post by:
Hello - Is there any way to match complex subtree patterns with XPath? The functions I see all seem to match along a single path from root to leaf. I would like to match full subtrees. For...
10
by: bpontius | last post by:
The GES Algorithm A Surprisingly Simple Algorithm for Parallel Pattern Matching "Partially because the best algorithms presented in the literature are difficult to understand and to implement,...
5
by: olaufr | last post by:
Hi, I'd need to perform simple pattern matching within a string using a list of possible patterns. For example, I want to know if the substring starting at position n matches any of the string I...
9
by: Jim Lewis | last post by:
Anyone have experience with string pattern matching? I need a fast way to match variables to strings. Example: string - variables ============ abcaaab - xyz abca - xy eeabcac - vxw x...
2
by: Ole Nielsby | last post by:
First, bear with my xpost. This goes to comp.lang.c++ comp.lang.functional with follow-up to comp.lang.c++ - I want to discuss an aspect of using C++ to implement a functional language, and...
19
by: konrad Krupa | last post by:
I'm not expert in Pattern Matching and it would take me a while to come up with the syntax for what I'm trying to do. I hope there are some experts that can help me. I'm trying to match...
9
by: Chris | last post by:
Is anyone aware of any prior work done with searching or matching a pattern over nested Python lists? I have this problem where I have a list like: , 9, 9], 10] and I'd like to search for the...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
14
DJRhino1175
by: DJRhino1175 | last post by:
When I run this code I get an error, its Run-time error# 424 Object required...This is my first attempt at doing something like this. I test the entire code and it worked until I added this - If...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
5
by: DJRhino | last post by:
Private Sub CboDrawingID_BeforeUpdate(Cancel As Integer) If = 310029923 Or 310030138 Or 310030152 Or 310030346 Or 310030348 Or _ 310030356 Or 310030359 Or 310030362 Or...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
0
by: lllomh | last post by:
How does React native implement an English player?
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.