php - 匹配 unicode block 或索引范围的正则表达式

标签 php regex unicode pcre

我正在尝试创建一个正则表达式来匹配 unicode block 中的任何字符 - 特别是 Mathematical Alphanumeric Symbols block 。

此处的目的是识别使用 Unicode 字符的内容的使用,以获得不同的文本格式,例如通常不支持的粗体或斜体文本。有很多网站 like this one 可以帮助用户转换文本。

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

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

PHP 似乎也不支持命名变体,因此我无法执行 \p{Math} 之类的操作。

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

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

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

abcdefghijklmnopqrstuvwxyz0123456789

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

𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗

最佳答案

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

$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 的右上角面板中进行了解释,如果您想探索/简化/修改它,请在this link中,如果您愿意,您可以观察它如何与一些示例输入匹配。


引用

RegEx for Mathematical Alphanumeric Symbols

Unicode Regular Expressions

关于php - 匹配 unicode block 或索引范围的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319513/

相关文章:

javascript - 使用 Ajax 发布评论而不刷新页面?

php - 如何使用 Composer 安装 jQuery?

python - 删除python中字符串开头的一些点

delphi - 从 Delphi 2007 迁移时的 CharInSet 批量转换

mysql - UTF-8字符有问题;我看到的不是我存储的

php - 获取 20 个最频繁的数字对 (2/2) 和三元组 (3/3)

php - 网站、API 和 iPhone 应用程序让用户通过 Facebook 登录

c# - 正则表达式:目标并部分替换

Javascript 货币正则表达式

SQL Server 2012 未在结果中显示 unicode 字符