手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

Unicode转换

其实只是一段很少的代码。

http://www.kalvin.cn/article/php-encrypt-decrypt-unicode-string-functions-and-escape/
  1. <?php    
  2. function uni_decode($s) {    
  3.     preg_match_all('/\&\#([0-9]{2,5})\;/'$s$html_uni);    
  4.     preg_match_all('/[\\\%]u([0-9a-f]{4})/ie'$s$js_uni);    
  5.     $source = array_merge($html_uni[0], $js_uni[0]);    
  6.     $js = array();    
  7.     for($i=0;$i<count($js_uni[1]);$i++) {    
  8.         $js[] = hexdec($js_uni[1][$i]);    
  9.     }    
  10.     $utf8 = array_merge($html_uni[1], $js);    
  11.     $code = $s;    
  12.     for($j=0;$j<count($utf8);$j++) {    
  13.         $code = str_replace($source[$j], unicode2utf8($utf8[$j]), $code);    
  14.     }    
  15.     return $code;//$s;//preg_replace('/\\\u([0-9a-f]{4})/ie', "chr(hexdec('\\1'))",  $s);    
  16. }    
  17.    
  18. function unicode2utf8($c) {    
  19.     $str="";    
  20.     if ($c < 0x80) {    
  21.          $str.=chr($c);    
  22.     } else if ($c < 0x800) {    
  23.          $str.=chr(0xc0 | $c>>6);    
  24.          $str.=chr(0x80 | $c & 0x3f);    
  25.     } else if ($c < 0x10000) {    
  26.          $str.=chr(0xe0 | $c>>12);    
  27.          $str.=chr(0x80 | $c>>6 & 0x3f);    
  28.          $str.=chr(0x80 | $c & 0x3f);    
  29.     } else if ($c < 0x200000) {    
  30.          $str.=chr(0xf0 | $c>>18);    
  31.          $str.=chr(0x80 | $c>>12 & 0x3f);    
  32.          $str.=chr(0x80 | $c>>6 & 0x3f);    
  33.          $str.=chr(0x80 | $c & 0x3f);    
  34.     }    
  35.     return $str;    
  36. }    
  37.    
  38. $str='%u5927%u5BB6%u597D%uFF0C我是孤魂!<br />\u8FD9\u662F\u6D4B\u8BD5\u6587\u672C\uFF01';    
  39. echo uni_decode($str); // 大家好,我是孤魂!这是测试文本!    
  40. ?>  

这段代码以前也写过,而且,其实用的地方挺多,比如json的字符串(有些只是json处理了一下,但并不能完全转换,总不能强制变成json格式再转换吧?)
其实黑的很方便,而且这段代码在PHP手册中的注释里也出现过,但一下子找不到了,于是看到后就做了个备份罢了

version_compare

在项目中遇到点小问题。。。
比如:1.4.0与1.4.1对比。还有1.2与1.21对比
在初期的时候,我都是直接使用version_compare来对比的,但这时候就出现了问题

在国人眼中,1.21其实是1.2的后续版本,它是比1.3小的一个版本。但。。。version_compare即不认的。它认为1.21>1.2,当然1.21也>1.3。。。
好纠结啊。。。

后面没办法,对于1.4.0这种用version_compare了。对于1.21的,直接浮点数来比较了。NND

以后对版本号还是需要有一个规划,不能乱写啊

利用curl上传文件

利用php的curl库上传文件真的很方便
注意几点
1、只能是POST
2、可以不写头(平时的form有文件和无文件时发送的时候,)
3、postfields的时候,不要你傻傻的http_build_query,你越是这么做了。黑黑。。。就反而不一定对了
4、上传的文件用@来连接。
一个很小的例子

PHP代码
  1. $formAction = 'http://xxx/xxx/xx.upload.php';  
  2. $postVals = array(  
  3.      // /var/www/www.jpg 这个地址是绝对地址哦。可以让程序读取  
  4.      // windows下面可能就是d:/xxx/xxx/xxx.jpg  
  5.      'img'=>'@/var/www/xxx.jpg'//img就相当于表单中的<input type="file" name="img" />  
  6.    
  7. );  
  8. $ch = curl_init();  
  9. curl_setopt($ch, CURLOPT_URL, $formAction); //登录地址  
  10. curl_setopt($ch, CURLOPT_POST, 1); //这是POST数据  
  11. curl_setopt($ch, CURLOPT_POSTFIELDS, ($postVals)); //http_build_query( $postData)); ,如果你真用http_build_query,不一定能成功。所以。。。还是有curl自己去组合吧  
  12. $res = curl_exec($ch);
  13. curl_close($ch);  

看看多简单,一下子就成功了

推荐小程序:TimThumb – PHP Image Resizer

这是一个单文件处理缩略图的程序,直接引用生成缩略图。有点意思,主要是方便啦 .。

官方地址是:http://www.binarymoon.co.uk/projects/timthumb/
文件也很小,只有一点点大,更关键的是可以缓存回来。也能取远程的图片,也可以设置allow的安全站点,这样就相对安全一点了,官方这么介绍 :
TimThumb is a simple, flexible, PHP script that resizes images. You give it a bunch of parameters, and it spits out a thumbnail image that you can display on your site.

TimThumb has seen a massive amount of use across the WordPress world, and a few months after we released it, I took over development from Tim, a friend of Darren Hoyts, who created the original script. Since I took over there have been a whole host of changes, bug fixes, and additions.

I set up this page to act as an archive/ resource, showing the best documentation and demos available for TimThumb. If you have any TimThumb related articles then please feel free to send them over to me so that I can add them to the list.

功能也相对比较方便,用法也很简单,官方现成就举了一些例子,并通过这些例子介绍了它的参数:

How to use TimThumb

看了上面的使用方法,再看看,这个,你就知道很多常见的方法和用法了:

stands for values What it does
src source url to image Tells TimThumb which image to resize › tutorial
w width the width to resize to Remove the width to scale proportionally (will then need the height) › tutorial
h height the height to resize to Remove the height to scale proportionally (will then need the width) › tutorial
q quality 0 - 100 Compression quality. The higher the number the nicer the image will look. I wouldn't recommend going any higher than about 95 else the image will get too large › tutorial
a alignment c, t, l, r, b, tl, tr, bl, br Crop alignment. c = center, t = top, b = bottom, r = right, l = left. The positions can be joined to create diagonal positions › tutorial
zc zoom / crop 0, 1, 2, 3 Change the cropping and scaling settings › tutorial
f filters too many to mention Let's you apply image filters to change the resized picture. For instance you can change brightness/ contrast or even blur the image › tutorial
s sharpen   Apply a sharpen filter to the image, makes scaled down images look a little crisper › tutorial
cc canvas colour hexadecimal colour value (#ffffff) Change background colour. Most used when changing the zoom and crop settings, which in turn can add borders to the image.
ct canvas transparency true (1) Use transparency and ignore background colour

参数很简单,就是不太好记。。。纠结啊

不过用起来的话,是真心简单

 

Tags: thumb

旧文:QeePHP中的优秀函数(三)

这几个函数还是来自于QeePHP的核心类Q中。不过,我是自认为,我的configure类有部分写的比他好,不过我没有考虑删除之类的。呵呵。

PHP代码
  1. /** 
  2.  * 获取指定的设置内容 
  3.  * 
  4.  * $option 参数指定要获取的设置名。 
  5.  * 如果设置中找不到指定的选项,则返回由 $default 参数指定的值。 
  6.  * 
  7.  * @code php 
  8.  * $option_value = Q::ini('my_option'); 
  9.  * @endcode 
  10.  * 
  11.  * 对于层次化的设置信息,可以通过在 $option 中使用“/”符号来指定。 
  12.  * 
  13.  * 例如有一个名为 option_group 的设置项,其中包含三个子项目。 
  14.  * 现在要查询其中的 my_option 设置项的内容。 
  15.  * 
  16.  * @code php 
  17.  * // +--- option_group 
  18.  * //   +-- my_option  = this is my_option 
  19.  * //   +-- my_option2 = this is my_option2 
  20.  * //   \-- my_option3 = this is my_option3 
  21.  * 
  22.  * // 查询 option_group 设置组里面的 my_option 项 
  23.  * // 将会显示 this is my_option 
  24.  * echo Q::ini('option_group/my_option'); 
  25.  * @endcode 
  26.  * 
  27.  * 要读取更深层次的设置项,可以使用更多的“/”符号,但太多层次会导致读取速度变慢。 
  28.  * 
  29.  * 如果要获得所有设置项的内容,将 $option 参数指定为 '/' 即可: 
  30.  * 
  31.  * @code php 
  32.  * // 获取所有设置项的内容 
  33.  * $all = Q::ini('/'); 
  34.  * @endcode 
  35.  * 
  36.  * @param string $option 要获取设置项的名称 
  37.  * @param mixed $default 当设置不存在时要返回的设置默认值 
  38.  * 
  39.  * @return mixed 返回设置项的值 
  40.  */  
  41. static function ini($option$default = null)  
  42. {  
  43.     if ($option == '/'return self::$_ini;  
  44.   
  45.     if (strpos($option'/') === false)  
  46.     {  
  47.         return array_key_exists($option, self::$_ini)  
  48.             ? self::$_ini[$option]  
  49.             : $default;  
  50.     }  
  51.   
  52.     $parts = explode('/'$option);  
  53.     $pos =& self::$_ini;  
  54.     foreach ($parts as $part)  
  55.     {  
  56.         if (!isset($pos[$part])) return $default;  
  57.         $pos =& $pos[$part];  
  58.     }  
  59.     return $pos;  
  60. }  
  61.   
  62. /** 
  63.  * 修改指定设置的内容 
  64.  * 
  65.  * 当 $option 参数是字符串时,$option 指定了要修改的设置项。 
  66.  * $data 则是要为该设置项指定的新数据。 
  67.  * 
  68.  * @code php 
  69.  * // 修改一个设置项 
  70.  * Q::changeIni('option_group/my_option2', 'new value'); 
  71.  * @endcode 
  72.  * 
  73.  * 如果 $option 是一个数组,则假定要修改多个设置项。 
  74.  * 那么 $option 则是一个由设置项名称和设置值组成的名值对,或者是一个嵌套数组。 
  75.  * 
  76.  * @code php 
  77.  * // 假设已有的设置为 
  78.  * // +--- option_1 = old value 
  79.  * // +--- option_group 
  80.  * //   +-- option1 = old value 
  81.  * //   +-- option2 = old value 
  82.  * //   \-- option3 = old value 
  83.  * 
  84.  * // 修改多个设置项 
  85.  * $arr = array( 
  86.  *      'option_1' => 'value 1', 
  87.  *      'option_2' => 'value 2', 
  88.  *      'option_group/option2' => 'new value', 
  89.  * ); 
  90.  * Q::changeIni($arr); 
  91.  * 
  92.  * // 修改后 
  93.  * // +--- option_1 = value 1 
  94.  * // +--- option_2 = value 2 
  95.  * // +--- option_group 
  96.  * //   +-- option1 = old value 
  97.  * //   +-- option2 = new value 
  98.  * //   \-- option3 = old value 
  99.  * @endcode 
  100.  * 
  101.  * 上述代码展示了 Q::changeIni() 的一个重要特性:保持已有设置的层次结构。 
  102.  * 
  103.  * 因此如果要完全替换某个设置项和其子项目,应该使用 Q::replaceIni() 方法。 
  104.  * 
  105.  * @param string|array $option 要修改的设置项名称,或包含多个设置项目的数组 
  106.  * @param mixed $data 指定设置项的新值 
  107.  */  
  108. static function changeIni($option$data = null)  
  109. {  
  110.     if (is_array($option))  
  111.     {  
  112.         foreach ($option as $key => $value)  
  113.         {  
  114.             self::changeIni($key$value);  
  115.         }  
  116.         return;  
  117.     }  
  118.   
  119.     if (!is_array($data))  
  120.     {  
  121.         if (strpos($option'/') === false)  
  122.         {  
  123.             self::$_ini[$option] = $data;  
  124.             return;  
  125.         }  
  126.   
  127.         $parts = explode('/'$option);  
  128.         $max = count($parts) - 1;  
  129.         $pos =& self::$_ini;  
  130.         for ($i = 0; $i < = $max$i ++)  
  131.         {  
  132.             $part = $parts[$i];  
  133.             if ($i < $max)  
  134.             {  
  135.                 if (!isset($pos[$part]))  
  136.                 {  
  137.                     $pos[$part] = array();  
  138.                 }  
  139.                 $pos =& $pos[$part];  
  140.             }  
  141.             else  
  142.             {  
  143.                 $pos[$part] = $data;  
  144.             }  
  145.         }  
  146.     }  
  147.     else  
  148.     {  
  149.         foreach ($data as $key => $value)  
  150.         {  
  151.             self::changeIni($option . '/' . $key$value);  
  152.         }  
  153.     }  
  154. }  
  155.   
  156. /** 
  157.  * 替换已有的设置值 
  158.  * 
  159.  * Q::replaceIni() 表面上看和 Q::changeIni() 类似。 
  160.  * 但是 Q::replaceIni() 不会保持已有设置的层次结构, 
  161.  * 而是直接替换到指定的设置项及其子项目。 
  162.  * 
  163.  * @code php 
  164.  * // 假设已有的设置为 
  165.  * // +--- option_1 = old value 
  166.  * // +--- option_group 
  167.  * //   +-- option1 = old value 
  168.  * //   +-- option2 = old value 
  169.  * //   \-- option3 = old value 
  170.  * 
  171.  * // 替换多个设置项 
  172.  * $arr = array( 
  173.  *      'option_1' => 'value 1', 
  174.  *      'option_2' => 'value 2', 
  175.  *      'option_group/option2' => 'new value', 
  176.  * ); 
  177.  * Q::replaceIni($arr); 
  178.  * 
  179.  * // 修改后 
  180.  * // +--- option_1 = value 1 
  181.  * // +--- option_2 = value 2 
  182.  * // +--- option_group 
  183.  * //   +-- option2 = new value 
  184.  * @endcode 
  185.  * 
  186.  * 从上述代码的执行结果可以看出 Q::replaceIni() 和 Q::changeIni() 的重要区别。 
  187.  * 
  188.  * 不过由于 Q::replaceIni() 速度比 Q::changeIni() 快很多, 
  189.  * 因此应该尽量使用 Q::replaceIni() 来代替 Q::changeIni()。 
  190.  * 
  191.  * @param string|array $option 要修改的设置项名称,或包含多个设置项目的数组 
  192.  * @param mixed $data 指定设置项的新值 
  193.  */  
  194. static function replaceIni($option$data = null)  
  195. {  
  196.     if (is_array($option))  
  197.     {  
  198.         self::$_ini = array_merge(self::$_ini$option);  
  199.     }  
  200.     else  
  201.     {  
  202.         self::$_ini[$option] = $data;  
  203.     }  
  204. }  
  205.   
  206. /** 
  207.  * 删除指定的设置 
  208.  * 
  209.  * Q::cleanIni() 可以删除指定的设置项目及其子项目。 
  210.  * 
  211.  * @param mixed $option 要删除的设置项名称 
  212.  */  
  213. static function cleanIni($option)  
  214. {  
  215.     if (strpos($option'/') === false)  
  216.     {  
  217.         unset(self::$_ini[$option]);  
  218.     }  
  219.     else  
  220.     {  
  221.         $parts = explode('/'$option);  
  222.         $max = count($parts) - 1;  
  223.         $pos =& self::$_ini;  
  224.         for ($i = 0; $i < = $max$i ++)  
  225.         {  
  226.             $part = $parts[$i];  
  227.             if ($i < $max)  
  228.             {  
  229.                 if (!isset($pos[$part]))  
  230.                 {  
  231.                     $pos[$part] = array();  
  232.                 }  
  233.                 $pos =& $pos[$part];  
  234.             }  
  235.             else  
  236.             {  
  237.                 unset($pos[$part]);  
  238.             }  
  239.         }  
  240.     }  
  241. }  

 

Tags: qeephp