首页 > 解决方案 > 匹配 unicode 块或索引范围的正则表达式

问题描述

我正在尝试创建一个正则表达式,它将匹配 unicode 块中的任何字符 - 特别是数学字母数字符号块。

此处的目的是识别使用 Unicode 字符的内容的使用,以便在其文本上获得不同的格式,例如粗体或斜体文本,但通常不受支持。有很多网站,比如这个可以帮助用户转换文本的网站。

我尝试使用速记属性代码,但它似乎与我期望的块中的所有字符都不匹配。

preg_match('/\p{Sm}/i', '') === 1; // false

PHP 似乎也不支持命名的变体,所以我不能做类似\p{Math}.

我相信我需要定位块范围 - 从 U+1D400 - U+1D7FF,但我无法弄清楚如何正确构建这个正则表达式。这就是我认为我会让它工作的方式,但它似乎不起作用。

preg_match('/\x{1D400}-\x{1D7FF}/i', '') === 1; // false

我希望这些字符都不匹配(直接在我的键盘上输入):

abcdefghijklmnopqrstuvwxyz0123456789

我希望这些字符中的每一个都匹配(与上面相同,使用上面的链接转换为数学粗体):


标签: phpregexunicodepcre

解决方案


我猜这个表达式可能有效,但不确定:

$re = '/[\x{1D400}-\x{1D7FF}]+/su';
$str = '';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);

\p{S} or \p{Symbol}: math symbols, currency signs, dingbats, box-drawing characters, etc.
\p{Sm} or \p{Math_Symbol}: any mathematical symbol.
\p{Sc} or \p{Currency_Symbol}: any currency sign.
\p{Sk} or \p{Modifier_Symbol}: a combining character (mark) as a full character on its own.
\p{So} or \p{Other_Symbol}: various symbols that are not math symbols, currency signs, or combining characters.

该表达式在regex101.com的右上角面板上进行了说明,如果您希望探索/简化/修改它,并且在此链接中,您可以查看它如何与一些示例输入匹配,如果您愿意的话。


参考

数学字母数字符号的正则表达式

Unicode 正则表达式


推荐阅读