我正在尝试创建一个正则表达式来匹配 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中,如果您愿意,您可以观察它如何与一些示例输入匹配。
引用
关于php - 匹配 unicode block 或索引范围的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319513/