Regex Anchors

Summary: in this tutorial, you’ll learn how to use the regex anchors to match the start and the end of a string.

Introduction to the regex anchors

Unlike character classes, the regex anchors do not match characters, but a position before or after characters:

  • ^ : The caret anchor (^) matches the beginning of a string.
  • $ : the dollar anchor ($) matches the end of a string.

The following example uses a regular expression that matches any character P in a string:

<?php

$pattern = '/P/';
$str = 'PHP';

if (preg_match_all($pattern, $str, $matches)) {
    print_r($matches[0]);
}Code language: PHP (php)

It returns two characters P in the string PHP:

Array
(
    [0] => P
    [1] => P
)Code language: PHP (php)

However, if you add the caret anchor (^) to the regular expression, it’ll match only the letter P at the beginning of the string:

<?php

$pattern = '/^P/';
$str = 'PHP';

if (preg_match_all($pattern, $str, $matches)) {
    print_r($matches[0]);
}Code language: PHP (php)

Output:

Array
(
    [0] => P
)Code language: PHP (php)

The following example uses the dollar anchor ($) to match a number at the end of a string:

<?php

$pattern = '/\d$/';
$str = 'PHP 8';

if (preg_match_all($pattern, $str, $matches)) {
    print_r($matches[0]);
}Code language: PHP (php)

It returns the number 8 as expected:

Array
(
    [0] => 8
)Code language: PHP (php)

The following regular expression uses the caret (^) and dollar ($) anchors to match a time string with the format hh:mm:

<?php

$pattern = '/^\d\d:\d\d$/';
$message = '12:15';

if (preg_match_all($pattern, $message, $matches)) {
    print_r($matches[0]);
}Code language: PHP (php)

Output:

Array
(
    [0] => 12:15
)Code language: PHP (php)

Regex anchor and multiline mode

By default, the caret ^ and $ anchors treat a string as a single line of character even if the string contains newline characters. For example:

<?php

$pattern = '/^\d/';
$message = <<<'text'
            1. First item
            2. Second item
            3. Third item
            text;

if (preg_match_all($pattern, $message, $matches)) {
    print_r($matches[0]);
}Code language: PHP (php)

Output:

Array
(
    [0] => 1
)Code language: PHP (php)

In this example, the regular expression "/^\d/" matches a digit at the beginning of a string. It returns the number 1 as expected.

In some cases, you may want to match a digit at the beginning of the line instead, not just the beginning of the string.

To do that, you add the m flag at the end of the regular expression like this:

<?php

$pattern = '/^\d/m';
$message = <<<'text'
            1. First item
            2. Second item
            3. Third item
            text;

if (preg_match_all($pattern, $message, $matches)) {
    print_r($matches[0]);
}Code language: PHP (php)

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)Code language: PHP (php)

The m' flag stands for multiline. When thism’ flag is set, the caret (^) and dollar ($) anchor will match the start and the end of each line in the string.

Note that if a string doesn’t have any newlines, the m flag will have no effect.

Summary

  • The caret anchor (^) matches at the start of a string.
  • The dollar anchor ($) matches at the end of a string.
  • The m flag instructs those anchors to match at the beginning and end of the line.
Did you find this tutorial useful?