簡體   English   中英

Unicode 正則表達式:編譯失敗:字符類中的范圍亂序

[英]Unicode Regular Expression: Compilation failed: range out of order in character class

我將取自https://twemoji.maxcdn.com/v/latest/twemoji.js的正則表達式轉換為匹配與表情符號相關的 Unicode 字符從 javascript 到 php。

當我使用 regex101.com 對其進行測試時,轉換后的正則表達式按預期工作

但是,當我在本地環境中測試時,它不起作用。

你可以在這里看到一個工作示例https://regex101.com/r/IuIhBF/1

這是PHP版本。 http://sandbox.onlinephpfunctions.com/code/3bd5933f5230fc1c45104b7eccd9379b68870016

我嘗試更改 preg_match_all 標志。 將 u 添加到正則表達式中,例如:/*****/u

無法讓它工作

如果有人可以幫助我解決該錯誤,那就太好了:編譯失敗:偏移量 306 處字符類中的范圍亂序。

這個表達式似乎正在處理您的樣本,帶有u標志:

$re = '/[\x{1f300}-\x{1f5ff}\x{1f900}-\x{1f9ff}\x{1f600}-\x{1f64f}\x{1f680}-\x{1f6ff}\x{2600}-\x{26ff}\x{2700}-\x{27bf}\x{1f1e6}-\x{1f1ff}\x{1f191}-\x{1f251}\x{1f004}\x{1f0cf}\x{1f170}-\x{1f171}\x{1f17e}-\x{1f17f}\x{1f18e}\x{3030}\x{2b50}\x{2b55}\x{2934}-\x{2935}\x{2b05}-\x{2b07}\x{2b1b}-\x{2b1c}\x{3297}\x{3299}\x{303d}\x{00a9}\x{00ae}\x{2122}\x{23f3}\x{24c2}\x{23e9}-\x{23ef}\x{25b6}\x{23f8}-\x{23fa}]/u';
$str = 'Time in emoji is very expressive. 🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 allowed us to communicate time very easily.

Next up was negation. ❌🗣️ means “No talk.”';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

該表達式在regex101.com 的右上角面板中進行了解釋,如果您希望探索/簡化/修改它,並且在此鏈接中,您可以觀看它如何與某些示例輸入匹配,如果您願意的話。

參考

我如何在忽略表情符號的同時匹配非字母數字的正則表達式特殊字符?

對於emoji ,您應該使用 Utf-16 代理對正則表達式。
utf-8/32 正則表達式太慢了。

請參閱此鏈接以獲取 Unicode 版本 12 表情符號正則表達式和測試。
需要 3.4 秒,所以如果超時(默認為 2 秒),只需超時
在設置中。

相比之下,utf-8/32 正則表達式需要將近 40 秒(需要 //u 標志)。

所以,一定要堅持使用 emoji regex 的代理對。

https://regex101.com/r/k61Df5/1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM