PHP 8 has a native function to retrieve the actual error message, so these helper functions are no longer necessary.
https://www.php.net/preg_last_error_msg
<?php
preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');
if (preg_last_error() !== PREG_NO_ERROR) {
echo preg_last_error_msg(); // Prints "Backtrack limit exhausted"
}
?>
PHP.mk документација
preg_last_error
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
function.preg-last-error.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + превод во позадина
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
function.preg-last-error.php
preg_last_error
Референца за `function.preg-last-error.php` со подобрена типографија и навигација.
preg_last_error
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
preg_last_error — Враќа код за грешка од последното извршување на PCRE регуларен израз
= NULL
preg_last_error(): int
Враќа код за грешка од последното извршување на PCRE регуларен израз.
Пример #1 preg_last_error() example
<?php
preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');
if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
echo 'Backtrack limit was exhausted!';
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Backtrack limit was exhausted!
Параметри
Оваа функција нема параметри.
Вратени вредности
Враќа една од следниве константи (објаснети на нивната сопствена страница):
Белешки од корисници 10 белешки
nicoSWD ¶
пред 5 години
gk на anuary dot com ¶
12 години пред
In PHP 5.5 and above, getting the error message is as simple as:
<?php
echo array_flip(get_defined_constants(true)['pcre'])[preg_last_error()];
andre на koethur точка de ¶
12 години пред
Here is a more advanced function to convert an error code to text:
<?php
function preg_errtxt($errcode)
{
static $errtext;
if (!isset($errtxt))
{
$errtext = array();
$constants = get_defined_constants(true);
foreach ($constants['pcre'] as $c => $n) if (preg_match('/_ERROR$/', $c)) $errtext[$n] = $c;
}
return array_key_exists($errcode, $errtext)? $errtext[$errcode] : NULL;
}
?>
Thomas Mueller ¶
пред 6 години
Here is a correction to one of the previous "get error message" snippets. It filters out the non-error codes which stops "Warning: array_flip(): Can only flip STRING and INTEGER values!" from being emitted due to ["PCRE_JIT_SUPPORT"]=>bool(true):
<?php
echo array_flip(array_filter(get_defined_constants(true)['pcre'], function ($value) {
return substr($value, -6) === '_ERROR';
}, ARRAY_FILTER_USE_KEY))[preg_last_error()];
Анонимен ¶
пред 6 години
If you use T-Regx library, to get the last constant, you can use
<?php
echo preg_last_error_constant(); // 'PREG_BAD_UTF8_ERROR'
johan на bluemoonit dot net ¶
пред 15 години
The above function pcre_error_deocde [sic] is not correct - not all of the used constants are errors constants. For example, when the error is actually PREG_BAD_UTF8_ERROR, the function outputs the text for PREG_SPLIT_OFFSET_CAPTURE.
eu на ericruiz dot com dot br ¶
пред 9 години
Take it into account before use this function.
My php --version
PHP 5.6.29 (cli) (built: Dec 8 2016 09:19:46)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
On Linux Fedora 23 4.8.13-100.fc23.x86_64 #1 SMP Fri Dec 9 14:51:40 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
<?php
// @see http://stackoverflow.com/questions/4440626/how-can-i-validate-regex
// returns true because there is no opening "(" for the closing ")"
var_dump(preg_match('~InvalidRegular)Expression~', null) === false);
// this SHOULD be something different from 0, but...
var_dump(preg_last_error());
?>
zerodahero на gmail dot com ¶
пред 6 години
In PHP 7.3+, and depending on the environment, there may be other constants that aren't ints which will cause errors with array_flip. I opted to go with a RegexException and a filter on gk's note.
<?php
class RegexException extends \Exception {
public $errorCode;
public function __construct(
int $errorCode,
string $additionalMessage = null
) {
$this->errorCode = $errorCode;
$errorMessage = $this->getErrorString($errorCode) ?? 'Unknown regex error';
$additionalMessage = $additionalMessage ? " $additionalMessage" : '';
parent::__construct("Regex error thrown: $errorMessage." . $additionalMessage);
}
/**
* Gets an error string (const name) for the PCRE error code
*
* @param int $errorCode
*
* @return string|null
*/
private function getErrorString(int $errorCode): ?string
{
$pcreConstants = get_defined_constants(true)['pcre'] ?? [];
/*
* NOTE: preg_last_error() returns an int, but there are constants
* in PHP 7.3+ that are strings, bools, or otherwise. We can pretty
* safely filter out the non-integers to fetch the appropriate
* error constant name.
*/
$pcreConstants = array_filter($pcreConstants, function ($code) {
return is_int($code);
});
$errorStrings = array_flip($pcreConstants);
return $errorStrings[$errorCode] ?? null;
}
Usage:
throw new RegexException(preg_last_error());
andre на koethur точка de ¶
12 години пред
Just an addition to my previous note: In unicode mode (with "u" modifier), PREG_BAD_UTF8_ERROR only reflects errors in the subject string. If the pattern itself contains invalid characters, preg_match() (or preg_match_all()) returns false but preg_last_error() returns 0 indicating PREG_NO_ERROR. Instead, php issues a warning: "preg_match(): Compilation failed: invalid UTF-8 string at offset 0"
Владимир Валикаев ¶
пред 6 години
Getting error as text (small update):
<?php
echo array_flip(array_filter(get_defined_constants(true)['pcre'], function($v) { return is_integer($v); }))[preg_last_error()];