Leonhart 27
Leonhart 27

Reputation: 101

php regular expression parse data

I have a field which contain 20 character (pad string with space character from right) like below:

VINEYARD HAVEN MA
BOLIVAR TN
,
BOLIVAR, TN
NORTH TONAWANDA, NY

How can I use regular expression to parse and get data, the result I want will look like this:

[1] VINEYARD HAVEN [2] MA

[1] BOLIVAR [2] TN

[1] , or empty [2] , or empty

[1] BOLIVAR, or BOLIVAR [2] TN or ,TN

[1] NORTH TONAWANDA, or NORTH TONAWANDA [2] NY or ,NY

Currently I use this regex:

^(\D*)(?=[ ]\w{2}[ ]*)([ ]\w{2}[ ]*)

But it couldnot match the line:

,

Please help to adjust my regex so that I match all data above

Upvotes: 1

Views: 69

Answers (2)

tomas.lang
tomas.lang

Reputation: 499

What about this regex: ^(.*)[ ,](\w*)$ ? You can see working it here: http://regexr.com/3cno7.


Example usage:

<?php

$string = 'VINEYARD HAVEN MA
BOLIVAR TN
,
BOLIVAR, TN
NORTH TONAWANDA, NY';

$lines = array_map('trim', explode("\n", $string));

$pattern = '/^(.*)[ ,](\w*)$/';

foreach ($lines as $line) {
    $res = preg_match($pattern, $line, $matched);

    print 'first: "' . $matched[1] . '", second: "' . $matched[2] . '"' . PHP_EOL;
}

Upvotes: 1

symcbean
symcbean

Reputation: 48387

It's probably possible to implement this in a regular expression (try /(.*)\b([A-Z][A-Z])$/ ), however if you don't know how to write the regular expression you'll never be able to debug it. Yes, its worth finding out as a learning exercise, but since we're talking about PHP here (which does have a mechanism for storing compiled REs and isn't often used for bulk data operations) I would use something like the following if I needed to solve the problem quickly and in maintainable code:

$str=trim($str);
if (preg_match("/\b[A-Z][A-Z]$/i", $str, $match)) {
    $state=$match[0];
    $town=trim(substr($str,0,-2)), " ,\t\n\r\0\x0B");
}

Upvotes: 0

Related Questions