preg_replace_callback 实现比较优雅的替换

下面两种方法用于将类似한这样的片段转换成正常的文字

第一种方法先用正则将需要替换的片段找到,然后循环处理, 第二种方法使用了preg_replace_callback ,第二种方法代码量较少,看起来更加优雅.

方法一

<?php
$test_str="曾한李국어" ;
echo unescape($test_str);
function unescape($str) {
    preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
    $ar = $r[0];
    foreach($ar as $k=>$v) {
        if(substr($v,0,2) == "%u"){
            $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4)));
      }
        elseif(substr($v,0,3) == "&#x"){
            $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1)));
      }
        elseif(substr($v,0,2) == "&#") {
            $ar[$k] = iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1)));
        }
    }
    return join("",$ar);
}
?>

方法二

<?php
$test_str="曾한李국어" ;
echo preg_replace_callback("/(%u.{4})|&#x.{4};|&#\d+;/ i", "unescape", $test_str);
function unescape($str_org) {    
    $str_org=$str_org[0];
        if(substr($str_org,0,2) == "%u"){
            $str_fin = iconv("UCS-2BE","UTF-8",pack("H4",substr($str_org,-4)));
      }
        elseif(substr($str_org,0,3) == "&#x"){
            $str_fin = iconv("UCS-2BE","UTF-8",pack("H4",substr($str_org,3,-1)));
      }
        elseif(substr($str_org,0,2) == "&#") {
            $str_fin = iconv("UCS-2BE","UTF-8",pack("n",substr($str_org,2,-1)));
        }
        return $str_fin ;
}
?>

时间: 2024-10-14 06:26:56

preg_replace_callback 实现比较优雅的替换的相关文章

什么是热修复?

插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能,插件化的知识可以查我我之前的介绍:Android插件化.本篇重点讲解热修复,并对当前流行的热修复技术做一个简单的总结. 热修复 什么是热修复? 简单来讲,为了修复线上问题而提出的修补方案,程序修补过程无需重新发版! 技术背景 在正常软件开发流程中,线下开发->上线->发现bug->紧急修复上线.不过对于这种方式代价太大.  而热修复的开发流程显得更加灵活,无需重新发版,实时高效热修复,无

Android常用库

原文链接:http://www.jianshu.com/p/19368c2cdcaf 系统框架 1. 网络请求 Android Async HTTP Android异步HTTP库 AndroidAsync 异步Socket,HTTP(客户端+服务器),WebSocket,和socket.io库.基于NIO而不是线程. Okhttp Http与Http/2的客户端 Retrofit okhttp再封装 Volley Google推出的Android异步网络请求框架和图片加载框架 2. 网络解析 G

安装ecshop2.7时候的错误处理 php版本不兼容引起

装ECShop2.7.3出现了一堆问题,主要是因为PHP版本过高引起的,不愿意降低版本,则只能一个个解决啦!这些问题包括:preg_replace.cls_image::gd_version.end(explode('.', $tmp)). 一.关于preg_replace 因为使用PHP5.5.x,ECShop安装完成之后出现了下面提示,特别是在cls_template.php文件中.下面就将需要替换的部分一一替换. Deprecated: preg_replace(): The /e mod

C#和Java之比较(语法篇)

C#和Java作为独立发展的两种程序设计语言,其实有很多相似的地方:当然,其中还是有一些不同的点的:假如一个熟悉C#但不清楚java的程序员去写java程序,其实没有多大困难,只是如果清楚了C#和Java中的一些不同的点,应该可以更快的从C#过渡到Java的. 本文主要是列举了笔者在学习Java过程中和C#比较的一些异同.希望可以给同样从C#转向Java的开发人员提供一些信息. IBM的开发者网站提供了一个不错的java入门系列,对于初学者来说不妨一看. https://www.ibm.com/

阿里Sophix热修复

阿里巴巴对Android热修复技术已经进行了长达多年的探索. 最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dexposed.但这个方案由于对底层Dalvik结构过于依赖,最终无法继续兼容Android5.0以后ART虚拟机,因此作罢. 后来支付宝提出了新的热修复方案Andfix.Andfix同样是一种底层结构替换的方案,也达到了运行时生效即时修复的效果,并且重要的是,做到了Dalvik和ART环境的全版本兼容

tidb入门

由于目前的项目把mysql换成了TiDb,所以特意来了解下tidb.其实也不能说换,由于tidb和mysql几乎完全兼容,所以我们的程序没有任何改动就完成了数据库从mysql到TiDb的转换,TiDB 是一个分布式 NewSQL (SQL . NoSQL 和 NewSQL 的优缺点比较 )数据库.它支持水平弹性扩展.ACID 事务.标准 SQL.MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库.下面是对有关资料的整

(一)分布式数据库tidb-简介

因为数据磁盘问题,最近进行了更换库,所以决定写关于这方面的专题的博客,博客信息参考的官方文档. 一.分布式数据库使用背景 随着互联网的飞速发展,业务量可能在短短的时间内爆发式地增长,对应的数据量可能快速地从几百 GB 涨到几百个 TB,传统的单机数据库提供的服务,在系统的可扩展性.性价比方面已经不再适用.比如MySQL数据库,缺点是没法做到水平扩展.MySQL 要想能做到水平扩展,唯一的方法就业务层的分库分表或者使用中间件等方案.但是,这些中间层方案也有很大局限性,执行计划不是最优,分布式事务,

TIDB简介

摘自https://pingcap.com/docs-cn/ TiDB 是 PingCAP 公司设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性.TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性.TiDB 的目标是为 OLTP (Online Transactional Processing) 和 OLAP (Online Analyti

C#中一种替换switch语句更优雅的写法

今天在项目中遇到了使用switch语句判断条件,但问题是条件比较多,大概有几十个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢? 假设有这样的一个场景:商场经常会根据情况采取不同的打折方案,如果打折方案比较少,可以考虑使用switch语句作判断.但如果有几十甚至几百种打折方案的时候,用switch语句就不够优雅. 先来一个打折接口. public interface IValueProcessor { decimal DaZhe(short policy,decimal o