Jadual Kandungan
What Is preg_last_error()?
Common Error Codes and Their Meanings
1. PREG_INTERNAL_ERROR (1)
2. PREG_BAD_UTF8_ERROR (5)
3. PREG_BAD_UTF8_OFFSET_ERROR (6)
4. PREG_JIT_STACKLIMIT_ERROR (7)
5. PREG_RECURSION_LIMIT_ERROR (2)
How to Use preg_last_error() Effectively
Pro Tips for Debugging Regex in PHP
Final Notes
Rumah pembangunan bahagian belakang tutorial php Debugging Corak Anda: Panduan untuk `preg_last_error ()` dan maknanya

Debugging Corak Anda: Panduan untuk `preg_last_error ()` dan maknanya

Aug 07, 2025 pm 09:35 PM
PHP Regular Expressions

preg_last_error() 返回最后一个 PCRE 函数调用的错误代码,用于精准排查正则表达式错误。1. PREG_INTERNAL_ERROR (1) 表示 PCRE 内部错误,通常需更新 PHP 或报告漏洞;2. PREG_BAD_UTF8_ERROR (5) 表示字符串或模式包含无效 UTF-8,应确保使用正确的编码;3. PREG_BAD_UTF8_OFFSET_ERROR (6) 表示 UTF-8 偏移不合法,应使用 mb_strlen() 等函数校正偏移位置;4. PREG_JIT_STACKLIMIT_ERROR (7) 表示 JIT 栈溢出,可通过禁用 JIT 或简化正则避免;5. PREG_RECURSION_LIMIT_ERROR (2) 表示递归超限,应优化模式或调整 pcre.recursion_limit。使用 preg_last_error() 可区分匹配失败与语法错误,结合 switch 语句处理各类错误,并避免使用 @ 抑制错误,确保问题可追踪,从而提升 PHP 正则处理的稳定性与可维护性。

Debugging Your Patterns: A Guide to `preg_last_error()` and its Meanings

When working with regular expressions in PHP, even a small typo or incorrect syntax can cause a pattern to fail. While PHP’s preg_* functions are powerful, they don’t always make it obvious why a regex failed. That’s where preg_last_error() comes in — it’s a crucial tool for debugging pattern errors.

Debugging Your Patterns: A Guide to `preg_last_error()` and its Meanings

This function returns an integer representing the error code from the last PCRE (Perl Compatible Regular Expressions) function call. By interpreting this code, you can pinpoint what went wrong and fix your regex more efficiently.


What Is preg_last_error()?

After using any preg_* function (like preg_match(), preg_replace(), or preg_split()), if the function returns false, it often means an error occurred. However, false could mean either “no match” or “actual error.” To distinguish between them, call preg_last_error():

Debugging Your Patterns: A Guide to `preg_last_error()` and its Meanings
if (preg_match('/(unbalanced/', $subject) === false) {
    $errorCode = preg_last_error();
    echo "Regex error: " . $errorCode;
}

But numbers aren’t helpful on their own — you need to know what they mean.


Common Error Codes and Their Meanings

Here are the most frequent error codes returned by preg_last_error(), along with explanations and how to fix them:

Debugging Your Patterns: A Guide to `preg_last_error()` and its Meanings

1. PREG_INTERNAL_ERROR (1)

This indicates a PCRE library internal error — very rare in practice.

  • Cause: Usually due to a bug in PHP or PCRE itself.
  • Fix: Update PHP or report the issue. In most cases, this isn’t caused by your code.

2. PREG_BAD_UTF8_ERROR (5)

Your subject string or pattern contains invalid UTF-8 data when using the u modifier.

// Example: Invalid byte sequence
$subject = "café"; // But encoded incorrectly
preg_match('/café/u', $subject);
  • Fix: Ensure your strings are properly UTF-8 encoded.
  • If processing user input, consider using mb_convert_encoding() or utf8_encode() as needed.

Tip: This error can also occur in the pattern itself if you're using non-UTF-8 characters with the u flag.

3. PREG_BAD_UTF8_OFFSET_ERROR (6)

Occurs when using PREG_OFFSET_CAPTURE with u, and the offset doesn't align with UTF-8 character boundaries.

preg_match('/\w+/u', 'café', $matches, PREG_OFFSET_CAPTURE, 3);
// Offset 3 might fall in the middle of 'é' (multi-byte)
  • Fix: Use valid start positions. Better yet, work with code points or validate offsets using mb_strlen().

4. PREG_JIT_STACKLIMIT_ERROR (7)

PCRE’s Just-In-Time (JIT) compiler ran out of stack space.

// Common with very complex or deeply nested patterns
preg_match('/^(a+)+$/', $longString);
  • Cause: Overly complex regex or long input triggering JIT limits.
  • Fix:
    • Disable JIT: Use preg_match($pattern, $subject, $matches, PREG_NO_ERROR | PREG_JIT_STACKLIMIT_ERROR);
    • Or simplify your pattern to avoid catastrophic backtracking.

Note: You can also increase pcre.jit_stacklimit in php.ini, but fixing the pattern is safer.

5. PREG_RECURSION_LIMIT_ERROR (2)

Exceeded the recursion limit during matching (often due to complex subpatterns or backreferences).

// Deeply recursive pattern
preg_match('/(a|b)+(c+)?/', str_repeat('a', 100000));
  • Fix:
    • Simplify the regex.
    • Increase pcre.recursion_limit in php.ini (not recommended for production).
    • Avoid greedy quantifiers on large inputs.

How to Use preg_last_error() Effectively

Always check the result of preg_* functions and use preg_last_error() when results are unexpected.

$pattern = '/[a-z/u'; // Missing closing bracket
$subject = 'hello';

$result = preg_match($pattern, $subject);

if ($result === false) {
    switch (preg_last_error()) {
        case PREG_INTERNAL_ERROR:
            echo "Internal PCRE error";
            break;
        case PREG_BAD_UTF8_ERROR:
            echo "Invalid UTF-8 in subject or pattern";
            break;
        case PREG_BAD_UTF8_OFFSET_ERROR:
            echo "Invalid UTF-8 offset";
            break;
        case PREG_JIT_STACKLIMIT_ERROR:
            echo "JIT stack limit exceeded – consider disabling JIT or simplifying regex";
            break;
        case PREG_RECURSION_LIMIT_ERROR:
            echo "Recursion limit exceeded – check for overly complex patterns";
            break;
        default:
            echo "Unknown error";
    }
} elseif ($result === 0) {
    echo "No match found (but no error)";
}

Pro Tips for Debugging Regex in PHP

  • Test patterns in isolation: Use tools like regex101.com (with PCRE mode) to validate syntax.
  • Avoid @ suppression: Using @preg_match() hides errors — you won’t see warnings or be able to use preg_last_error().
  • Use PREG_NO_ERROR after checks: Once you’ve handled an error, reset expectations.
  • Log errors in production: When a regex fails, log both the error code and the pattern/subject (careful with sensitive data).

Final Notes

preg_last_error() won’t tell you exactly which character broke your pattern, but it narrows down the problem category significantly. Combined with careful pattern design and input validation, it becomes an essential part of robust PHP development.

Use it every time a preg_* function returns false, and you’ll spend less time guessing and more time fixing.

Basically, don’t ignore the error — decode it.

Atas ialah kandungan terperinci Debugging Corak Anda: Panduan untuk `preg_last_error ()` dan maknanya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1532
276
Beyond Numeric Captures: Memanfaatkan kumpulan bernama dalam `preg_match` dan` preg_replace` Beyond Numeric Captures: Memanfaatkan kumpulan bernama dalam `preg_match` dan` preg_replace` Aug 04, 2025 pm 03:44 PM

NamedCapturGegroupSinphpprovideAclearandMaintainableWayToExtractMatchedTextBySsigningMeaningFulnamesInsteadofRelyingonNumericindices.1.use (? Corak) atau ('name'pattern) syntaxtodefinamedgroupsinpccer.2

Pengubah `u` yang dilepaskan: menyelam mendalam ke regex unicode-sware dalam php Pengubah `u` yang dilepaskan: menyelam mendalam ke regex unicode-sware dalam php Aug 03, 2025 am 06:39 AM

TheumodifierinphpregexisSessSentialforpoperutf-8andunicodesupport.1.itensurestHepatternandInputstringaretreatedasutf-8, mencegahMisMisinterpretationofmulti-batecharacters.withouter, aksara-aksara

Menguasai Lookaheads dan Lookbehinds untuk Penegasan String Kompleks Menguasai Lookaheads dan Lookbehinds untuk Penegasan String Kompleks Aug 04, 2025 am 06:35 AM

Penegasan positif (? = ...), pernyataan negatif (?! ...), pernyataan positif (??

Corak rekursi di PCRE untuk menghuraikan struktur bersarang Corak rekursi di PCRE untuk menghuraikan struktur bersarang Aug 11, 2025 am 11:06 AM

Pcre'srecursivePatternSenableMatchingNestedStructuresLikeparentHesesorBracketSing (? R) ornamedReference (? & Name), membolehkanTherTexenginetohandlebalanconstructsbyRecursifyPlyShePattern;

Bila hendak menggunakan `preg_replace` vs` preg_replace_callback_array` untuk penggantian kompleks Bila hendak menggunakan `preg_replace` vs` preg_replace_callback_array` untuk penggantian kompleks Aug 08, 2025 pm 06:10 PM

USEPREG_RAPLOPSIMPLEPATTERNSWITHSWITHSTREPEMENTSORBackReferences.2.USEPREG_RAPLEP

Membentuk parser fail log yang mantap dengan php's `preg_match_all` Membentuk parser fail log yang mantap dengan php's `preg_match_all` Aug 03, 2025 am 09:20 AM

Gunakan fungsi preg_match_all untuk bekerjasama dengan ungkapan biasa untuk menghuraikan fail log php dengan cekap. 1. Pertama menganalisis format log seperti CLF Apache; 2. Membina corak biasa dengan kumpulan penangkapan yang dinamakan untuk mengekstrak IP, kaedah, laluan dan bidang lain; 3. Gunakan preg_match_all untuk bekerjasama dengan bendera preg_set_order untuk menghuraikan log berbilang baris dalam kelompok; 4. Mengendalikan kes kelebihan seperti medan yang hilang atau balak silang; 5. Sahkan dan taipkan tukar data yang diekstrak, dan akhirnya menukar log tidak berstruktur ke dalam data array berstruktur untuk pemprosesan selanjutnya.

Taming the Beast: Mengurangkan mundur bencana di PCRE Taming the Beast: Mengurangkan mundur bencana di PCRE Aug 03, 2025 am 07:17 AM

CASTASTROPHICHICBACTTRACKINGOCRSWHENNESTEDGREEDYQuantifiersCauseexponentialBackTrackingonFailedMatches, asin^(a) $ melawan "aaaax" .2.UseatomicGroups (?> (...)

Dari Pengesahan ke Transformasi: Panduan untuk `preg_filter` Dari Pengesahan ke Transformasi: Panduan untuk `preg_filter` Aug 08, 2025 pm 06:37 PM

preg_filter hanya mengembalikan hasil penggantian apabila dipadankan, jika tidak, ia akan kembali null, sesuai untuk senario di mana pengesahan dan penukaran diperlukan; 1. Perbezaan utama di antara itu dan preg_replace adalah bahawa ia mengembalikan null bukannya rentetan asal apabila tidak sepadan; 2. Ia sesuai untuk mengekalkan dan menukar data yang sesuai dengan corak; 3. Apabila pemprosesan array, ia secara automatik menapis unsur -unsur tidak sepadan tetapi mengekalkan nama -nama utama, dan boleh diubah semula dengan array_values; 4. Menyokong backreferences dan prestasi sederhana, sesuai untuk pemprosesan bentuk, penulisan semula URL dan senario lain; 5. Apabila anda perlu menyimpan semua input, anda harus menggunakan preg_replace, sementara dalam senario pengesahan dan penukaran, preg_filter lebih efisien dan ringkas.

See all articles