php - 使用 preg_match_all 和 UTF-8 正确 PREG_OFFSET_CAPTURE
问题描述
我正在使用 preg_match_all 在字符串中查找所有标签及其位置
preg_match_all('/<\/?([a-zA-Z]+)[^>]*>/', $text, $tags, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
它适用于 Windows-1251,但是一旦我切换到 UTF-8(并将 /u 添加到正则表达式)
preg_match_all('/<\/?([a-zA-Z]+)[^>]*>/u', $text, $tags, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
它可以正确识别标签,但会错误计算偏移量。
为了解决这个问题,我尝试转换为 UTF-32
$text32 = mb_convert_encoding($text, 'utf-32', 'utf-8');
preg_match_all('/<\/?([a-zA-Z]+)[^>]*>/', $text32, $tags, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
这打破了更多,它返回 void$tags
数组。
我试图将正则表达式与文本一起转换:
$text32 = mb_convert_encoding($text, 'utf-32', 'utf-8');
preg_match_all(mb_convert_encoding('/<\/?([a-zA-Z]+)[^>]*>/', 'utf-32', 'utf-8'), $text32, $tags, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
但它现在甚至看不到正则表达式:
PHP Warning: preg_match_all(): Null byte in regex
所以我的问题是如何使 preg_match_all 与 UTF-32 一起工作?或者如何修复 UTF-8 编码的不正确偏移量。
PS我尝试了UTF-16,结果相同。PPS php 文件编码为 UTF-8。
解决方案
推荐阅读
- reactjs - react-modal:如何关闭一个模式并同时打开一个新模式?
- google-cloud-platform - 使用服务帐号更新团队云端硬盘权限
- php - azure web app fopen('test.csv') 保存在哪里?
- python - Python:同一函数中所需变量的名称和“内容”
- php - Dreamweaver CC (2017) 提示在包含文件的外部不起作用
- vba - 使用 VBA 预览 Outlook 附件
- java - Spring Boot 应用程序未拉入外部 application.properties 文件
- java - SQLHelper 的游标返回带指数的数字
- jquery - 防止在移动设备上加载视频
- python - 来自帖子的龙卷风重定向完成,未捕获出现在控制台中