Search in the array for the first occurrence of a string until space, then convert it to month.
$arr = [
"May Hello",
"Jun Hello12",
"Jul 3"
];
$str = $arr[0];
$matches = [];
$pattern = '/^w+s/';
preg_match_all($pattern, $str, $matches);
Replace $pattern in $arr:
$pattern = [
'/^w+s/' => date('m', strtotime($matches[0][0])) . ' ', // fist string until space
];
$arr = preg_replace(array_keys($pattern), array_values($pattern), $arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
unexpected:
Array
(
[0] => 05 7 Hello
[1] => 05 Hello12
[3] => 05 3
)
expected:
Array
(
[0] => 05 7 Hello
[1] => 06 Hello12
[3] => 07 3
)
What am I doing wrong?
3
Answers
You should use
preg_replace_callback
when you want to run a function on the matched results:Output:
Use a word boundary in the pattern to ensure that only a 3-letter word is found at the start of the string. In the closure, you can convert the fullstring match to its zero-padded month number and omit the concatenation of a trailing space.
Code: (Demo)
For better processing economy, you can keep a cache of translated month values to avoid calling two functions (or instantiating a datetime object and calling a method) to generate replacement strings each time. The closure becomes a little more verbose though. (Demo)
Depending on your input strings, if the letters of the 3-letter month are guaranteed to not occur later in the string then you can create a translation array and call
strtr()
to avoid regex. (Demo)