精华内容
下载资源
问答
  • $result = preg_replace($pattern, $repl, $result); echo $result; 上面这段代码的作用,我就不解释了,可以自己执行一下。 执行后你会发现出现有乱码,经过查资料发现是$repl写错了,应该用\\来做代替...

    还是用网站建设代码来说话吧:

    $pattern = "/ (href|src)=['|\"]http:\/\/(\w*\.?mysite\.com)\/([^\?'\"]*)['|\"]/i";

    $repl = " \1='http://\2/\3?p=faskdfkasdkf'";

    $result="<a href='http://eg.mysite.com/'>中国人</a>";
    $result = preg_replace($pattern, $repl, $result);
    echo $result;

    上面这段代码的作用,我就不解释了,可以自己执行一下。

    执行后你会发现出现有乱码,经过查资料发现是$repl写错了,应该用\\来做代替位置,正确格式如下:

    $repl = " \\1='http://\\2/\\3?p=faskdfkasdkf'";

    还有一点一定要注意:mb_ereg_replace 在并发情况下会内存泄露,造成压力测试无法通过。(fblww-0305)

    转载于:https://my.oschina.net/u/224509/blog/42531

    展开全文
  • 之前已经分析过strtr的源码了,现在就比较strtr, str_replacepreg_replace的效率: 复制代码 代码如下: $str = '111111110000000000000000000000000000000111000001000100010000010010000010

    http://www.jb51.net/article/39105.htm


    之前已经分析过strtr的源码了,现在就比较strtr, str_replace和preg_replace的效率:

    复制代码 代码如下:

    $str =
    '111111110000000000000000000000000000000111000001000100010000010010000010010000010100000010
    ';
    $str = str_repeat($str, 1);
    $pattern1 = array('12345'=>'', '67891'=>'');
    $pattern2 = array('a'=>'', '1234567890'=>'');
    $pattern3 = '/12345|67891/';
    $pattern4 = '/a|1234567890/';
    $pattern5 = array('12345', '67891');
    $pattern6 = array('a', '1234567890'); 
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
         strtr($str, $pattern1);
    }
    echo microtime(true)-$t, "/n";        //0.21915886878967   0.47268319129944 
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
         strtr($str, $pattern2);
    }
    echo microtime(true)-$t, "/n";        //0.4768660068512    2.7257590293884  
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
         preg_replace($pattern3, '', $str);
    }
    echo microtime(true)-$t, "/n";        //0.30504012107849    1.0864448547363 
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
         preg_replace($pattern4, '', $str);
    }
    echo microtime(true)-$t, "/n";        //0.30298089981079    1.117014169693  
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
         str_replace($pattern5, '', $str);
    }
    echo microtime(true)-$t, "/n";        //0.18029189109802    0.22510504722595 
    $t = microtime(true);
    for($i=0; $i<10000; $i++)
    {
         str_replace($pattern6, '', $str);
    }
    echo microtime(true)-$t, "/n";        //0.18104100227356   0.23055601119995 
    //说明:当str_repeat的第二个参数为1时输出第一个数字,当为8时输出第二个数字

    从输出结果来看,str_replace的整体表现相对strtr和preg_replace要好的。原因从查看str_replace的源码( http://code.google.com/p/cyy0523xc/source/browse/trunk/php/str_replace%E6%BA%90%E7%A0%81.c)就可以看出,str_replace(array search, string|array replace, string subject)在执行的时候会对search的每一个元素按照先后顺序进行循环(不是按照下标或者其他的什么顺序,这个和数组在底层的实现有关),然后到subject中去匹配,如果找到就替换为相应的replace。这样从效率上的确会比strtr好,因为还会多一个从下标的最大长度到最小长度的循环,如果这时下标字符串的长度变化比较大的话,且subject字符串比较长的话,这里的开销也是比较大的。不过str_replace这样的实现也有个我们需要注意的地方,就是它不会像strtr那样最大匹配优先。例如:
     
    复制代码 代码如下:

     str_replace(array('ab', 'abc'), '1', 'abcd');
     

    如果使用的是strtr,我们输出的结果会是“1d”,因为strtr会实现最大匹配。但是str_replace却会输出“1cd”,因为在search字符串中‘ab'排在“abc”的前面,所以会先把‘ab'替换成了‘1'。

    现在小结一下这三个函数的用法:
    str_replace:
    这个应该作为字符串替换的首选方法,不过有一点需要注意,就是把最希望匹配的元素放在前面。(为了效率的提升,有时这样做也是值得的)

    strtr: strtr在短字符串替换的时候也是挺高效的,不过search数组的下标长度的差别也对效率产生比较大的影响,还有就是没事最好不要使用strtr(string, string, string)这种形式(对于非单字节字符很容易产生乱码)。

    preg_replace:这个不用说,可以使用正则匹配,功能绝对是最强的,不过也是要牺牲一点效率的。

    展开全文
  • preg_replace( '/^[' . $trim_chars . ']*(?U)(.*)[' . $trim_chars . ']*$/u' , '\\1' , $string ); } 好吧,我稍微优化了一下,变成: function mb_trim ( $string ) { return preg_replace( '/(^\s...

    trim问题发现

    某天,线上展示的数据,发现多了问号,一排查,上游数据里多了0xC2和0xA0,百度查了一下,说是UTF8格式的空格,对应 网页里的&nbsp;这个东东。
    ok,问题找到了,简单对数据做一个trim就好了嘛,于是代码改成:

    $name = trim($name, chr(0xc2) . chr(0xa0));

    嗯,这么简单的代码还测试啥,上线吧!
    结果,当天就有负责审核的同学找来了,怎么数据都会少字啊,比如漫画变成了漫,画字不见了……

    var_dump(trim('平安普惠', chr(0xc2) . chr(0xa0)));
    // 打印结果是 平安普,少了一个惠字

    查了一下资料,原来php默认不能正确处理多字节字符,比如中文,如果要处理中文,要用mb_开头的函数,参考:http://php.net/manual/zh/ref.mbstring.php
    可是,问题来了,没有 mb_trim这样的函数啊啊啊!
    还好,上面的页面里也给了解决方案,用正则+utf8模式代替,嗯,php官方参考页面有其它用户提供了解决方案:

    function mb_trim($string, $trim_chars = '\s'){
        return preg_replace('/^['.$trim_chars.']*(?U)(.*)['.$trim_chars.']*$/u', '\\1',$string);
    }

    好吧,我稍微优化了一下,变成:

    function mb_trim($string){
        return preg_replace('/(^\s*)|(\s*$)/u', '', $string);
    }

    这回不能盲目上线了,对库中400万的数据遍历测试了一轮,果然出问题了,

    $str = '破千魂';
    $str2 = mb_trim($str);
    var_dump($str2); // str2变成了NULL

    查了半天资料,没有结论,后面想到\s*,即使没有空格也会进行替换,效率不好,改成\s+,结果就ok了,汗,最终的mb_trim函数定义如下:

    function mb_trim($string){
        // u模式符表示 字符串被当成 UTF-8处理
        return preg_replace('/(^\s+)|(\s+$)/u', '', $string);
    }

    后语,为啥\s*会出错呢?偶然发现在php5.2版本上,\s*也能正常工作,hhvm下也是正常的,
    再看我出问题的php,是5.4.33,赶紧去官网重新下载了一个5.4.45(php5.4最后一个版本),编译并测试后,发现结果也是正常的,重新下载5.4.33编译,问题依旧,
    至此,确认那是php5.4.33的一个bug了,不过最后那个版本的mb_trim还是能正常工作的。
    记录下来。

    展开全文
  • 之前已经分析过strtr的源码了,现在就比较strtr, str_replacepreg_replace的效率: $str = 111111110000000000000000000000000000000111000001000100010000010010000010010000010100000010; $str = str_repeat($...

    之前已经分析过strtr的源码了,现在就比较strtr, str_replace和preg_replace的效率:

     

     

     

    从输出结果来看,str_replace的整体表现相对strtr和preg_replace要好的。原因从查看str_replace的源码(http://code.google.com/p/cyy0523xc/source/browse/trunk/php/str_replace源码.c)就可以看出,str_replace(array search, string|array replace, string subject)在执行的时候会对search的每一个元素按照先后顺序进行循环(不是按照下标或者其他的什么顺序,这个和数组在底层的实现有关),然后到subject中去匹配,如果找到就替换为相应的replace。这样从效率上的确会比strtr好,因为还会多一个从下标的最大长度到最小长度的循环,如果这时下标字符串的长度变化比较大的话,且subject字符串比较长的话,这里的开销也是比较大的。不过str_replace这样的实现也有个我们需要注意的地方,就是它不会像strtr那样最大匹配优先。例如:

     

     

     

    如果使用的是strtr,我们输出的结果会是“1d”,因为strtr会实现最大匹配。但是str_replace却会输出“1cd”,因为在search字符串中‘ab’排在“abc”的前面,所以会先把‘ab’替换成了‘1’。

     

    现在小结一下这三个函数的用法:

    str_replace 这个应该作为字符串替换的首选方法,不过有一点需要注意,就是把最希望匹配的元素放在前面。(为了效率的提升,有时这样做也是值得的)

    strtr strtr在短字符串替换的时候也是挺高效的,不过search数组的下标长度的差别也对效率产生比较大的影响,还有就是没事最好不要使用strtr(string, string, string)这种形式(对于非单字节字符很容易产生乱码)。

    preg_replace 这个不用说,可以使用正则匹配,功能绝对是最强的,不过也是要牺牲一点效率的。

     

     

     

    展开全文
  • preg_replace() 乱码

    2015-02-10 23:31:30
    $search_input = preg_replace('/\s(?=\s)/','', $search_input); $search_array=explode(" ",$search_input); if (is_array($search_array)){ $search_array=implode("|",$search_array); } $...
  • 之前已经分析过strtr的源码了,现在就比较strtr, str_replacepreg_replace的效率:$str ='111111110000000000000000000000000000000111000001000100010000010010000010010000010100000010';$str = str_repeat($str...
  • $arr = preg_split('/[\n,]/u',$data['name'] ,0, PREG_SPLIT_NO_EMPTY);//u表示模式字符串被认为是utf-8 另标记一函数: mb_regex_encoding() \\指定的内部编码或字符编码将会当作此函数用的字符编码 转载...
  • $str = '獆狗';echo preg_replace('/[n|\r]/','',$str);输出: 转载于:https://blog.51cto.com/laokenet/1317470
  • $newstr = preg_replace($reg, $after, $str); // 进行替换 2、进行替换手机号 加密 $phone = '13011341390'; $new_phone = substr($phone , 0, 3).'****'.substr($phone , 7); 3、进行替换中文姓名 $str ...
  • 之前用trim,发现有一些nbsp这种的空格,以及中文空格,会无法trim,手工给trim设置第2个参数,会导致中文乱码, 后来改行 preg_replace,并使用u模式,代码很简单如下,结果还是会有问题: $str = '破千魂'; $...
  • 手册中的解释是 ”此修正符打开一个与perl不兼容的附加功能....正式因为这种编码的特殊行 如果你没有告诉php的再处理正则时用的是utf8 php可能自己就乱了 就容易吧中文截断出现乱码 如果加上这个参数呢 ...
  • PHP 正则表达式匹配 preg_match 与 preg_match_all 函数 正则表达式在 PHP 中的应用 在 PHP 应用中,正则表达式主要用于: 正则匹配:根据正则表达式匹配相应的内容正则替换:根据正则表达式匹配内容并替换正则...
  • 关于str_replace和strtr函数

    千次阅读 2011-04-14 19:37:00
    1,首先,肯定都会比preg_replace快。2,对于英文用户来说,可能strtr有时效率会高些。比如运行strtr($str, 'abc', 'xyz');时。函数会把$str中的a换成x,b换成y,c换成z。这个功能使str_replace不具备的。但是很可惜...
  • preg_replace未弃用可使用:$jsonuni = json_encode($car[$line][$site]);$json = preg_replace("#\\\u([0-9a-f]{4})#ie","iconv('UCS-2BE','utf-8',pack('H4','\\1'))",$jsonuni);echo $json;preg_replace 弃用后...
  • 用正则替换掉,preg_replace('/,\s*([\]}])/m', '$1',  $result_string ); (2) 将数据转换成数组或者在转换成json格式数据之后,会显示乱码: 这时候要用到urlencode()和urldecode() 以下是我的代码,经试验...
  • 之前,项目中就碰到了json_encode()中文编码点问题,我当时就搜了些资料,写了博客,写了一个php版本兼容的函数:   ... 当时,只是找到了答案,并未详细看。...preg_replace("#\\\u([0-9a-f]{4})#ie", "iconv('UCS-2
  • json_encode中文乱码解决

    万次阅读 2016-03-03 18:55:25
    $a='你好'; echo json_encode($a); 此时结果为:{"\uduiatsdiuas"};=>16进制 (1)存时十六进制,解析成中文 若是将中文json_encode后,解析数组回中文: ... return preg_replace_callback('/\\\\u([0-9a-f]{4}
  • PHP json中文unicode解码

    万次阅读 2014-04-04 23:46:25
    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in
  • json_encode 中文 乱码

    2017-11-30 21:13:25
    JSON和js一样,对于客户端的字符都是以UTF8的形式进行处理的,也就是说,使用JSON作为提交和接收的数据格式时字符都采用UTF8编码处理,当我们的页面编码和数据库编码不是采用UTF8的时候,就极容易出现中文乱码的问题...
  • $code = json_encode($str);... return preg_replace("#\\\u(([0-9a-f]+?){4})#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $code); 或者使用 $new_arr = array(); foreach($arr as $key=>$val){ $new_arr
  • 【汇总】php实用

    2009-07-04 10:07:42
    ?????优化下列函数 ... preg_replace('/a/', 'z', $str); preg_replace('/b/', 'z', $str); preg_replace('/c/', 'z', $str); return $str; }   6.如何处理SQL 注入 MySQL ...
  • $district = '徐汇区'; var_dump(trim($district,'区'));//��汇 var_dump(preg_replace('/区/','',$district));//徐汇 去除中文时最好不要用trim,而是用preg_replace
  • $output = preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $code); //utf8编码的中文 PS: 对于GB编码的中文,我们可以在编码时先转成UTF8编码,再进行编码,解码的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,726
精华内容 690
关键字:

preg_replace乱码