Regex Tester для PHP (PCRE, preg_match)
Виконує шаблон справжнім PCRE через preg_match, preg_match_all і preg_replace. Підсвітка збігів і таблиця груп.
Перевіряє регулярку саме так, як її виконає PHP
Більшість онлайн-тестерів працюють на рушії JavaScript, і поведінка розходиться з PHP у дрібницях, які потім коштують годину: іменовані групи в іншому синтаксисі, інакше працює прапорець для юнікоду, немає модифікатора x. Цей тестер виконує шаблон справжнім PCRE на сервері через ті самі preg_-функції, тому те, що ви бачите тут, збігається з поведінкою у вашому коді.
preg_match знаходить перший збіг і повертає 1 або 0, preg_match_all знаходить усі й повертає їхню кількість. Обидві функції складають групи в масив: числові за порядком дужок, іменовані ще й за ключем. Позиції збігів доступні з прапорцем PREG_OFFSET_CAPTURE, і саме вони показані в таблиці нижче.
$pattern = '/(?P<user>[\w.]+)@(?P<host>[\w.]+)/u';
if (preg_match_all($pattern, $text, $m, PREG_SET_ORDER)) {
foreach ($m as $hit) {
echo $hit['user'], ' на ', $hit['host'], PHP_EOL;
}
}
// Завжди перевіряйте результат: false означає помилку в шаблоні,
// а 0 — що збігів немає. Це різні речі.
Складні регулярки з вкладеними квантифікаторами на довгому тексті призводять до катастрофічного бектрекінгу: запит вішає процес. У PHP є ліміт pcre.backtrack_limit, і при його перевищенні preg_match повертає false, а не помилку. Якщо не перевіряєте результат, це виглядає як «збігів немає». Інструмент працює з жорстким лімітом, тому такий шаблон тут одразу впаде з поясненням.
Що питають про цей інструмент
Перевірте роздільники й екранування. У PHP шаблон це рядок, тому зворотні слеші треба або подвоювати в подвійних лапках, або писати в одинарних. Ще одна класика: роздільник / усередині шаблону без екранування; тоді краще взяти інший роздільник, наприклад #.
Без нього PCRE працює з байтами, а не символами: крапка зіставиться з половиною української літери, а \w не впізнає кирилицю. З прапорцем u шаблон і текст читаються як UTF-8. Для будь-якого тексту українською він обовʼязковий.
preg_match зупиняється на першому збігу; цього достатньо для перевірки формату. preg_match_all проходить весь текст і збирає всі збіги, що потрібно для витягування списків. Для великих текстів різниця в швидкості помітна, тому не беріть all там, де достатньо одного.