Still not getting correct results

Posted on 2013-01-28
Last Modified: 2013-02-16
Can someone please rescue me one more time.

This code by the great Ray Paseur works but according to the users, it is not working correctly.

Here is the current code (not all of it but the meat of it)

function format($matches)
    return $matches[1][0].(strlen($matches[2][0])>0?$matches[2][0]:" ").$matches[3][0].(strlen($matches[4][0])>0?"  ".$matches[4][0]:"");

= '/'         // regex delimiter
. '('         // START of a capture group
. '\d{2}'     // exactly two digits
. ')'         // END of capture group
. '('         // START SECOND capture group
. '[\sND]?'     // letters "D" OR "N" in any order or number - This is optional
. ')'         // END SECOND capture group
. '('         // START THIRD capture group
. '\d*'       // any number of digits
. ')'         // END THIRD capture group
. '('         // START FOURTH capture group
. 'GG'        // the letters "GG" EXACTLY
. '[\d]*'     // any number of digits
. ')'         // END THIRD capture group
. '?'         // make the LAST capture group OPTIONAL
. '/'         // regex delimiter

// create an array of matches
preg_match_all($pattern, $_GET['id'], $arr);

// REFORMAT the array
$str = format($arr);

Open in new window

According to the users, few things not working correctly.

1, when you run this code, with say this ID 143154614GG12445

It gives the following output
14 3154614  GG12445

Open in new window

It outs correctly as it puts a single space between 14 and 3154614 and puts 2 spaces before GG. This is fine.

Here is where problem starts.

It outputs several IDs that begin with 14...

According to the users, it should only out the ID you entered which is
14 3154614  GG12445

Open in new window

The other problem is that users should be able to search with zip codes and addresses.

The current app not using the regex we created can work with zip code, address and can output just one ID when searched with that ID.

With the regex integrated, the zip code, addresses don't work. They show an error.

And as stated, it outputs several IDs including the one we searched by.

I tried changing these lines from

preg_match_all($pattern, $_GET['id'], $arr);


preg_match_all($pattern, $_GET['id'], $matches);

and from

$str = format($arr);

$str = format($matches);

I was able to get it to return just the ID searched with as expected. So, this is good but I still need to ensure that we can still search with address and zip codes.

Please help!!
Question by:sammySeltzer
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
LVL 110

Expert Comment

by:Ray Paseur
ID: 38830667
For this and any other programming issue, the most important thing you can do is create the test data set.  This article will tell you why that is so important.

I would also add that I probably did not write line 3 of the code snippet.  I tend to avoid compound statements like that because they are too confusing to debug.

So to go forward with this question, please create a set of test data showing for each test case the following information.  It must be meticulously created - no typographical or spacing errors can be tolerated.  It must be desk-checked for precision.  Once you have that test data set, we can begin addressing the programming that will handle the following information.  The key elements we must see in order to do any programming at all are:

1. The exact input - perhaps several samples
2. For each input, the expected output

Please post your test data set and I'll have a run at showing you the PHP instructions to get from #1 to #2.

Best regards, ~Ray
LVL 29

Author Comment

ID: 38830925
what is on line 3?
LVL 29

Author Comment

ID: 38844578
Hello mates, the code below is almost working correctly.

It is formatting ids correctly except the first 2 digits.

For instance, as long as the ID has all digits and no characters or letters, a space needs to be inserted after the first 2 digits. Eg, 32 5414541246

As long as the ID has an N or D after the first digits and the rest are digits, no formatting is required. E.g, 32N5414541246

As long as the ID as digits and GG somewhere in the middle, there should be a space after the first 2 digits and 2 spaces before the GG. E.g, 32 54145  GG1246

Finally, as long as the ID has an N or D after the first 2 digits and GG somewhere between digits, there should only be 2 spaces after GG.

Other important rules,  if the digits are less than 6, then the ID is treated as zipcode.

The code below satisfies most of these requirements except one thing, it is NOT inserting a single space after the first 2 digits.

Does anyone of you php regex gurus know what I am missing?

Here is the code:

$patterns = array(

$replacements = array( '$1 $2', '$1  $2' );    

$id = preg_replace( $patterns, $replacements, $_GET['id'] );

Open in new window

Thanks a lot in advance
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

LVL 110

Expert Comment

by:Ray Paseur
ID: 38844645
I think the thing that is missing is the collection of test data and the corresponding expected outputs!  Once we have that, it will be much easier to help you get the program code to work correctly.

Just curious - where does this data come from?  I've never seen anything quite like this before.
LVL 29

Accepted Solution

sammySeltzer earned 0 total points
ID: 38844709
Ok, I finally figured this out.

This is a state data that we have to tap into.

So, setting up a test data is awfully difficult.

The only thing I could do is use the $var_dump(...)  to show what data it is collecting.

In any case, this is fixed and working correctly now.
LVL 110

Expert Comment

by:Ray Paseur
ID: 38876931
Sure would be nice if you would post the solution!
LVL 29

Author Comment

ID: 38876972
This is the solution.

Hopefully, it helps anyone who may bee in similar predicament.

$patterns = array(

$replacements = array( '$1 $2', '$1 $2  $3', '$1  $2' );

$id = preg_replace( $patterns, $replacements, $_GET['id'] );

Open in new window

works perfectly for us.
LVL 29

Author Closing Comment

ID: 38896140
I fixed the problem.

Featured Post

Enroll in May's Course of the Month

May’s Course of the Month is now available! Experts Exchange’s Premium Members and Team Accounts have access to a complimentary course each month as part of their membership—an extra way to increase training and boost professional development.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Generating table dynamically is the most common issue faced by php developers.... So it seems there is a need of an article that explains the basic concept of generating tables dynamically. It just requires a basic knowledge of html and little maths…
I imagine that there are some, like me, who require a way of getting currency exchange rates for implementation in web project from time to time, so I thought I would share a solution that I have developed for this purpose. It turns out that Yaho…
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to dynamically set the form action using jQuery.

737 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question