Dan Prince
Dan Prince

Reputation: 29989

Remove date from string with regular expressions

Ok, so I have a string $title_string which could look like any of the following:

$title_string = "20.08.12 First Test Event";
$title_string = "First Test event 20/08/12";
$title_string = "First Test 20.08.2012 Event";

I need to end up with two variables:

$title = "First Test Event";
$date = "20.08.12";

The formatting for the date should be converted to full-stops, regardless of what it was originally.

The Regex string that I started with looks something like this:

$regex = ".*(\d+\.\d+.\d+).*";

But I can't get this to work in the way I need it to. So all in all, I need to locate a date in a string, remove it from the string and format it correctly. Cheers.

Upvotes: 2

Views: 8873

Answers (3)

user1593705
user1593705

Reputation:

I made some tests and this should be ok the new_title() does a replace of / by . then the preg_split splits the string when the date is met

<?php 
$regex = "#(\d+[./]\d+[./]\d+)#";
print $regex . "\n\n";

print "20.08.12 First Test Event";
$title_string = new_string("20.08.12 First Test Event");
print $title_string . "\n";
$var = preg_split($regex,$title_string,-1,PREG_SPLIT_DELIM_CAPTURE);
print "result";
var_dump($var);

print "\n\n";

print "First Test event 20/08/12\n";
$title_string = new_string("First Test event 20/08/12");
print $title_string . "\n";
$var = preg_split($regex,$title_string,-1,PREG_SPLIT_DELIM_CAPTURE);
print "result";
var_dump($var);

print "\n\n";

$title_string = new_string("First Test 20.08.2012 Event");
print $title_string . "\n";
$var = preg_split($regex,$title_string,-1,PREG_SPLIT_DELIM_CAPTURE);
print "result";
var_dump($var);

function new_string($string) {
    return preg_replace_callback( "#(\d+)[./](\d+)[./](\d+)#",
            "new_date",
            $string);
}

function new_date($matches) {
  return $matches[1].'.'.$matches[2].'.'.$matches[3];
}

hope this could help

regards

Upvotes: 0

Elastic Lamb
Elastic Lamb

Reputation: 353

<?php
#$title_string = "20.08.12 First Test Event";
#$title_string = "First Test event 20/08/12";
$title_string = "First Test 20.08.2012 Event";

preg_match('~([0-9]{1,2}[\.|/][0-9]{1,2}[\.|/][0-9]{1,4})~', $title_string, $matches);
$date = $matches[1];
$title = preg_replace('~[[:space:]]{2,}~', ' ', str_replace($date, '', $title_string));

echo 'Date: '.$date.'<br />';
echo 'Title: '.$title;

Upvotes: 0

Janis Elsts
Janis Elsts

Reputation: 764

Matching dates with regular expressions can be quite complex. See this question for an example regex. Once you've found the date, you can remove it from the title using str_replace().

Here's a basic implementation:

$title_string = "20.08.12 First Test Event";

if ( preg_match('@(?:\s+|^)((\d{1,2})([./])(\d{1,2})\3(\d{2}|\d{4}))(?:\s+|$)@', $title_string, $matches) ) {
    //Convert 2-digits years to 4-digit years.
    $year = intval($matches[5]);
    if ($year < 30) { //Arbitrary cutoff = 2030.
        $year = 2000 + $year;
    } else if ($year < 100) {
        $year = 1900 + $year;
    }

    $date = $matches[2] . '.' . $matches[4] . '.' . $year;
    $title = trim(str_replace($matches[0], ' ', $title_string));
    echo $title_string, ' => ', $title, ', ', $date;
} else {
    echo "Failed to parse the title.";
}

Output:

20.08.12 First Test Event => First Test Event, 20.08.2012

Upvotes: 4

Related Questions