Named regex matches in php

by George Cadwallader
When dealing with those pesky regular expressions trying to get our matches by their index, making your code that little less readable.
Jun 11, 2020
When dealing with those pesky regular expressions trying to get our matches by their index, making your code that little less readable. When someone comes to your code we don’t want them requiring a second look to try to understand your pattern. With named matches in your regex, you can give matches a name to describe exactly what you’re matching.

A good example of this is matching parameters in URLs. You can give the variables in your URL a name making your code a bit more readable. In the URL

1
/category/1/post/5

we want to get the category id and the post id. A simple match would be to simply match the digits.

1
^\\/category\\/(\\d+)\\/post\\/(\\d+)$

This would then give you code something like:


1
2
3
4
5
6
$input_line = '/category/1/post/5'
preg_match('/^\\/category\\/(\\d+)\\/post\\/(\\d+)$/', $input_line, $output_array);

if ($output_array[1] === 1 && $output_array[2] === 5) {
    // Do some magic
}

We can give our matches a name by adding a

1
?<name>

to your pattern. So your new pattern will look like:


1
^\\/category\\/(?<category_id>\\d+)\\/post\\/(?<post_id>\\d+)$

Now we can refactor our code to make it that bit more readable:


1
2
3
4
5
6
$input_line = '/category/1/post/5'
preg_match('^\\/category\\/(?<category_id>\\d+)\\/post\\/(?<post_id>\\d+)$', $input_line, $output_array);

if ($output_array['category_id'] === 1 && $output_array['post_id'] === 5) {
    // Do some magic
}

Links to php live regex

More reads