preg_last_error

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

preg_last_error返回上次 PCRE 正则表达式执行的错误代码

说明

preg_last_error(): int

返回上次 PCRE 正则表达式执行的错误代码。

示例 #1 preg_last_error() 示例

<?php

preg_match
('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');

if (
preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
echo
'Backtrack limit was exhausted!';
}

?>

以上示例将输出

Backtrack limit was exhausted!

参数

此函数没有参数。

参见

添加注释

用户贡献的注释 10 个注释

nicoSWD
3 年前
PHP 8 有一个本机函数来检索实际的错误消息,因此这些辅助函数不再必要。

https://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(); // 打印 "Backtrack limit exhausted"
}

?>
gk at anuary dot com
10 年前
在 PHP 5.5 及更高版本中,获取错误消息就像

<?php
echo array_flip(get_defined_constants(true)['pcre'])[preg_last_error()];
andre at koethur dot de
11 年前
以下是一个更高级的函数,用于将错误代码转换为文本

<?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;
}

?>
Daniel Klein
4 年前
以下是之前“获取错误消息”代码段之一的更正。它过滤掉非错误代码,这将阻止由于 ["PCRE_JIT_SUPPORT"]=>bool(true) 而发出的 "Warning: array_flip(): Can only flip STRING and INTEGER values!"。

<?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()];
Anonymous
5 年前
如果您使用 T-Regx 库,要获取最后一个常量,您可以使用

<?php

echo preg_last_error_constant(); // 'PREG_BAD_UTF8_ERROR'
johan at bluemoonit dot net
14 年前
上面的函数 pcre_error_deocde [sic] 不正确 - 使用的常量并不都是错误常量。例如,当错误实际上是 PREG_BAD_UTF8_ERROR 时,函数输出 PREG_SPLIT_OFFSET_CAPTURE 的文本。
zerodahero at gmail dot com
4 年前
在 PHP 7.3+ 中,以及根据环境,可能存在其他不是整数的常量,这会导致 array_flip 错误。我选择使用 RegexException 并对 gk 的注释进行过滤。

<?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);
}

/**
* 获取 PCRE 错误代码的错误字符串(常量名称)
*
* @param int $errorCode
*
* @return string|null
*/
private function getErrorString(int $errorCode): ?string
{
$pcreConstants = get_defined_constants(true)['pcre'] ?? [];

/*
* 注意:preg_last_error() 返回一个 int,但在 PHP 7.3+ 中存在字符串、布尔值或其他类型的常量。我们可以相当安全地过滤掉非整数以获取相应的
* 错误常量名称。
*/
$pcreConstants = array_filter($pcreConstants, function ($code) {
return
is_int($code);
});

$errorStrings = array_flip($pcreConstants);

return
$errorStrings[$errorCode] ?? null;
}

用法:

throw new
RegexException(preg_last_error());
eu at ericruiz dot com dot br
7 年前
在使用此功能之前请考虑。

我的 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

// 由于没有与 ")" 匹配的 "(",所以返回 true
var_dump(preg_match('~InvalidRegular)Expression~', null) === false);

// 这应该与 0 不同,但是...
var_dump(preg_last_error());
?>
andre at koethur dot de
11 年前
只是对我之前笔记的补充:在 unicode 模式下(使用 "u" 修饰符),PREG_BAD_UTF8_ERROR 仅反映主题字符串中的错误。如果模式本身包含无效字符,则 preg_match()(或 preg_match_all())将返回 false,但 preg_last_error() 将返回 0,表示 PREG_NO_ERROR。相反,php 会发出警告:“preg_match(): Compilation failed: invalid UTF-8 string at offset 0”。
Vladimir Valikaev
5 年前
获取错误为文本(小更新)

<?php
echo array_flip(array_filter(get_defined_constants(true)['pcre'], function($v) { return is_integer($v); }))[preg_last_error()];
To Top