如何为PHP字符串中的Unicode符号包裹指定span标签?
问题
我从别处复制带Unicode符号的字符串到HTML表单,后端PHP处理代码如下:
$string = "❖ The Low Pressure ❖ Strong ✓ Light"; $string_new = htmlentities($string);
将转换后的字符串存入MySQL数据库后,使用TCPDF生成PDF,当前PDF输出代码为:
$pdf->AddFont('dejavusans'); $pdf->AddFont('helvetica'); $pdf->SetFont ('helvetica', '', '10' , '', 'default', true );
从数据库取出数据后执行以下代码输出:
$string = html_entity_decode($line); $pdf->writeHTML($string , true, false, true, false, '');
目前PDF输出正常,但我希望让字符串中的Unicode符号(如❖、✓)用dejavusans字体显示,英文内容保留helvetica字体,需要把所有Unicode符号包裹在带有font-family:dejavusans;样式的<span>标签中,转换后的目标字符串如下:
$string = "<span style=\"font-family:dejavusans;\">❖</span> The Low Pressure <span style=\"font-family:dejavusans;\">❖</span> Strong <span style=\"font-family:dejavusans;\">✓</span> Light";
请问如何实现给初始字符串中的所有Unicode符号自动添加对应的<span>标签?
解决方案
可以通过PHP的正则表达式替换功能,精准匹配字符串中的Unicode符号并包裹指定<span>标签,具体实现代码如下:
方法一:匹配所有非ASCII字符(适用于大部分符号场景)
// 先解码从数据库取出的内容 $string = html_entity_decode($line); // 用正则替换,将所有非ASCII的Unicode字符包裹到span中 $formattedString = preg_replace('/([^\x00-\x7F])/', '<span style="font-family:dejavusans;">$1</span>', $string); // 输出到PDF $pdf->writeHTML($formattedString, true, false, true, false, '');
方法二:精准匹配特定Unicode符号(更可控)
如果只需要处理指定的符号(比如❖、✓这类),可以直接匹配这些字符的Unicode编码,避免误匹配其他非英文内容:
$string = html_entity_decode($line); // 匹配❖(U+2756)和✓(U+2713)等符号,可根据需求添加更多 $formattedString = preg_replace('/(\x{2756}|\x{2713})/u', '<span style="font-family:dejavusans;">$1</span>', $string); $pdf->writeHTML($formattedString, true, false, true, false, '');
说明
- 正则表达式中的
[^\x00-\x7F]表示匹配所有ASCII范围外的字符,覆盖绝大多数Unicode符号; - 方法二中的
/u修饰符必须添加,确保PHP正确识别Unicode编码的正则匹配; - TCPDF的
writeHTML方法支持解析内联CSS样式,因此包裹后的符号会自动使用dejavusans字体渲染,英文内容则继承全局设置的helvetica字体。
内容的提问来源于stack exchange,提问作者yogi
相关产品推荐
相关产品推荐

