First, a question: match or no match?
$str = "123\n";
echo preg_match('~^\d+$~', $str);
If you think the function returns false
because the regular
expression operates in single-line mode and does not allow any characters other
than digits in the string, you are mistaken.
I'll digress slightly. Regular expressions in Ruby have a flaw (inconsistency
with the de facto PERL standard): the ^
and $
characters do not denote the start and end of the string, but only the start and
end of a line within it. Not knowing this fact can cause security
vulnerabilities, as noted in the Rails
documentation. PHP behaves as standard, but few know what exactly that
standard behavior means. The documentation for the meta-character $
is imprecise.
(now corrected)
Correctly, the $
character means the end of the string or a
terminating newline; in multiline mode (modifier m
), it means
the end of a line.
The actual end of the string is captured with the sequence \z
.
Alternatively, you can use the dollar sign together with the modifier
D
.
$str = "123\n";
echo preg_match('~^[0-9]+$~', $str); // true
echo preg_match('~^[0-9]+$~D', $str); // false
echo preg_match('~^[0-9]+\z~', $str); // false