Home > Blockchain >  Regex to split years, months, and weeks
Regex to split years, months, and weeks

Time:04-02

Given a string like this:

"7 years 11 months 3 weeks"

I need to parse it out so that in PHP, the preg_split function returns an array that contains:

0 => "7 years"
1 => "11 months"
2 => "3 weeks"

The age string can also contain zeros like "0 years 1 month 0 weeks".

The regex string I have right now only seems to split between years and months:

(?!\d )(?:\s)(?!\D )

and that is throwing off the calculations.

I'm not very familiar with regex and I can't figure out what I'm doing wrong.

CodePudding user response:

You can use

preg_match_all('~\d \s \w ~', $text, $matches)

See the regex demo.

Note that preg_match_all extracts all occurrences of pattern matches.

Details:

  • \d - one or more digits
  • \s - one or more whitespaces
  • \w - one or more letters/digits/underscores.

Other regex variations:

  • \d \s \S - the \S matches one or more non-whitespace chars, so it will match words with hyphens and any other special chars
  • \d*\.?\d \s \S - \d*\.?\d will match both integer and float values.

NOTE: To get the number and word as submatches capture them:

preg_match_all('~(\d )\s (\w )~', $text, $matches)

CodePudding user response:

The simplest solution is

$age = '7 years 11 months 3 weeks';

$result = preg_split('/ (?=\d)/', $age);

print_r($result);

Your regex is exactly equivalent to \s(?!\D) which should also work anyway, though if there was a space at the end of the string you would get an unwanted empty string result.

  • Related