Nejprve otázka: mačne nebo nemačne?
$str = "123\n";
echo preg_match('~^\d+$~', $str);
Kdo z vás si myslí, že funkce vrátí false
, protože
regulární výraz běží v jednořádkovém režimu a nepovoluje v řetězci
žádné jiné znaky krom číslic, ten se mýlil.
Malinko odbočím. Regulární výrazy v jazyce Ruby mají jednu nectnost
(nesoulad s de facto standardem PERLu): znaky ^
a $
neoznačují začátek a konec řetězce, ale jen jednoho řádku v něm.
Neznalost tohoto faktu může způsobit bezpečnostní zranitelnost, jak třeba
upozorňuje dokumentace
Rails. PHP se chová standardně, ale málokdo už ví, co přesně ono
standardní chování znamená. Dokumentace meta-znaku $
je totiž
nepřesná.
(už opraveno)
Správně má být, že znak $
znamená konec řetězce nebo
ukončující odřádkování; ve víceřádkovém režimu (modifikátor
m
) znamená konec řádku.
Skutečný konec řetězce chytá sekvence \z
.
Nebo je možné použít dolar společně s modifikátorem
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
Komentáře
Michal Špaček #1
$ je lépe popsán v kapitole o modifikátorech u modifikátoru m: https://www.php.net/…odifiers.php
starenka #2
Dobrá docka s příkladem nikdy neuškodí…
Jakub Vrána #3
Dokumentaci jsem zpřesnil: https://svn.php.net/…n.syntax.xml?…
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.