|-原 PHP的源代码BUG整理
trim()函数的bug
如果用trim($str,'。');
用句号最为两端消除符,str为中文等3字节的特定字符,返回的结果会乱码,例如
$str="倩女幽魂"; $str=trim($str,'。'); var_dump($str);die; //输出结果为 string(11) "倩女幽�"
可以看到,字符串长度11,有1个长度被截取掉了,所以是乱码 ...
|-摘 PHP 中英文混排截取字符串 (用php自带的函数,简单效果又好)
在网上找了几种代码,测试了,这个是最好的,还是官方的函数mb_strwidth()和mb_strimwidth()厉害,O(∩_∩)O
最后找到了笔记合适的
我自己用php内置函数写了字符串截取函数
//根据PHP内置函数写的截取字符串函数 20220423 if ( ! function_exists('mb_str_cut')){ function mb_str_cut($str,$length=20,$tailTag='...') { if(mb_strwidth($str, 'utf8')>$length){ $str = mb_strimwidth($str, 0, $length, $tailTag, 'utf8'); } return $str; } }
O(∩_∩)O,20220423,下面是我参考的内容
转~~~~~由于网上版本太多,不知道谁是原版,so~不标地址了
mb_strwidth($str, $encoding) 返回字符串的宽度
$str 要计算的字符串
$encoding 要使用的编码,如 utf8、gbk
mb_strimwidth($str, $start, $width, $tail, $encoding) 按宽度截取字符串
$str 要截取的字符串
$start 从哪个位置开始截取,默认是0
$width 要截取的宽度
$tail 追加到截取字符串后边的字符串,常用的是 ...
$encoding 要使用的编码
下边给大家实例演示:
<?php /** * utf8 编码格式 * 1个中文占用3个字节 * 我们希望的是1个中文占用2个字节, * 因为从宽度上看2个英文字母占用的位置相当于1个中文 */ // 测试字符串 $str = 'aaaa啊啊aaaa啊啊啊aaa'; echo strlen($str); // 只用strlen输出为25个字节 // 必须指定编码,不然会使用php的内码 mb_internal_encoding()可以查看内码 // 使用mb_strwidth输出字符串的宽度为20使用utf8编码 echo mb_strwidth($str, 'utf8'); // 只有宽度大于10才截取 if(mb_strwidth($str, 'utf8')>10){ // 此处设定从0开始截取,取10个追加...,使用utf8编码 // 注意追加的...也会被计算到长度之内 $str = mb_strimwidth($str, 0, 10, '...', 'utf8'); } // 最后输出 aaaa啊... 4个a算4个 1个啊算2个 3个点算3个 4+2+3=9 // 是不是很简单啊,有的人说了为什么是9个不是10个吗? // 因为正好“啊”的后边还是“啊”,中文算2个,9+2=11 超出了设定,所以去掉1个就是9了
下边再给大家介绍一些其它函数吧: ...
|-转 php如何查看扩展是否开启
用php -m命令查看PHP开启了那些扩展。php -m 在哪里运行?
在命令行窗口,windows在cmd里,Linux直接在命令行运行
不过如果没有配置php的路径的话,可以直接切换到php版本包含php.exe的目录下运行。
一、总结
一句话总结:php -m
1、查看php已安装扩展命令 ?
php -m
2、phpinfo();这是最常用的方法,但那么多扩展一时还真不太好找。?
3、extension_loaded()方法把想要知道是否开启的扩展传进去,他会返回布尔类型的值;?
4、当然我们也可以通过判断扩展库下的方法是否存在,来判断库是否已经被加载这时我们要用到function_exists()方法来判断;?
5、最后当然是直接调用函数,看看可以执行不;这里用gd_info()作为 测试?
6、结尾教大家一个获取一个库下所有函数的方法get_defined_functions()?
7、php快速查看扩展的版本信息?
命令为:
php --ri 扩展名。
例如:
php --ri memcached
结果如下:
php --ri memcached
memcached
memcached support => enabled
Version => 2.2.0
...(这里是省略的n多的版本信息文字)
8、比如查看php已安装扩展命令的语句:php -m 在哪里运行?
在windows命令行窗口,这是windows命令
不过如果没有配置php的路径的话,可以直接切换到php版本包含php.exe的目录下运行:
比如:D:\software\code\phpStudy2018\PHPTutorial\php\php-5.6.27-nts>php -m
9、PHP开启PDO和PDO_MySQL扩展的方法?
PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。 ...
|-转 CURL超时时间设置
一次完整的http请求,一般包含三个步骤:
- 通过DNS把域名解析成IP
- 通过IP地址连接到目标主机
- 获取目标主机数据(1、给目标主机输出http请求头,以\r\n\r\n结尾;2、获取目标主机传过来的数据)
php 的 curl 对以上三个步骤都有设置超时时间的方法
1、保存DNS信息时间
CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。
2、连接超时时间
CURLOPT_CONNECTTIMEOUT以秒为单位。如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS 以毫秒为单位。如果设置为0,则无限等待。
3、执行超时时间(DNS解析+连接+提交请求数据+获取请求数据? 或是提交请求数据+获取请求数据 ?)
CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。...
|-摘 PHP preg_quote() 函数
https://www.runoob.com/php/php-preg_quote.html
语法
string preg_quote ( string $str [, string $delimiter = NULL ] )
preg_quote() 需要参数 str 并向其中 每个正则表达式语法中的字符前增加一个反斜线。 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候。
正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
参数说明:
- $str: 输入字符串。
- $delimiter: 如果指定了可选参数 delimiter,它也会被转义。这通常用于 转义 PCRE 函数使用的分隔符。 / 是最通用的分隔符。
返回值
返回转义后的字符串。
实例
实例 1
<?php $keywords = '$40 for a g3/400'; $keywords = preg_quote($keywords, '/'); echo $keywords;
执行结果转义了 $ 和 / 特殊字符,如下所示:
返回 \$40 for a g3\/400
将文本中的单词替换为斜体
<?php //在这个例子中,preg_quote($word) 用于保持星号原文涵义,使其不使用正则表达式中的特殊语义。 $textbody = "This book is *very* difficult to find."; $word = "*very*"; $textbody = preg_replace ("/" . preg_quote($word) . "/", "<i>" . $word . "</i>", $textbody); echo $textbody; ...
|-转 PHP str_ireplace() 函数
https://www.feiniaomy.com/post/378.html
str_ireplace():查找与替换字符串中的指定内容,不区分大小写
语法:
str_ireplace(find,replace,string,count)
复制参数:
find:必需。规定要查找的值。
replace:必需。规定替换 find 中的值的值。
string:必需。规定被搜索的字符串。
count:可选。一个变量,对替换数进行计数。
例:PHP查找并替换字符串中的指定字符
示例代码:
<?php
$str = 'hello word!';
echo str_ireplace('hello','hi',$str);
?>
复制输出结果:
hi word!
复制例:PHP不区分大小写查换并替换字符串中的批定字符
示例代码:
<?php
//声明页面编码方式,不然中文乱码
//飞鸟慕鱼博客
header("Content-type: text/html; charset=utf-8");
$str = '我的博客网站是:FEINIAOMY.COM';
echo str_ireplace('FEINIAOMY.COM','feiniaomy.com',$str);
?>
复制输出结果:
我的博客网站是:feiniaomy.com
复制例:PHP查找替换数组中的元素,并输出替换的数量
示例代码:...
|-转 查看php位置
1.可以利用find / -name php.ini 查找一下,系统是否有php的配置文件
4.另外,如果系统已经安装了php,你还可以用php -v 查看版本号,前提是设置环境变量!...
|-转 php7.4 查看版本
这里要注意下,命令和之前的版本不同
php74 -v ,
[root@10-7-188-37 ~]# php74 -v PHP 7.4.26 (cli) (built: Nov 16 2021 15:31:30) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies
如果输入php -v,会提示没有该命令:-bash: php: command not found...
|-摘 PHP提示 cURL error 60: SSL certificate problem: unable to get local issuer certificate
下载cacert.pem,并放在php对应目录文件夹下
php5.6以上的版本会出现这种问题
解决办法:
访问https://curl.haxx.se/docs/caextract.html,下载cacert.pem,在php.ini文件添加...
|-转 php过滤表单输入的emoji表情
1.过滤emoji表情的原因
在我们的项目开发中,emoji表情是个麻烦的东西,即使我们可以能存储,也不一定能完美显示,因为它的更新速度很快:在iOS以外的平台上,例如PC或者android。如果你需要显示emoji,就得准备一大堆emoji图片并使用第三方前端类库才行。即便如此,还是可能因为emoji图片不够全而出现无法显示的情况
在大多数业务场景下,emoji也不是非要不可的。我们可以适当地考虑干掉它,节约各种成本。
2.php过滤emoji原理
Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是字符)是一套起源于日本的12x12像素表情符号,由栗田穣崇(Shigetaka Kurit)创作,最早在日本网络及手机用户中流行。自苹果公司发布的iOS5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。近期,更是有不少网友用emoji图案玩猜字游戏,享受这种表情文化带来的乐趣。
关于emoji的发音:很多人第一眼见到emoji便会下意识将其误读作“一磨叽”,其实不然,emoji音译过来大概读作“诶磨叽”,当中“e”的发音颇似字母abc的a的发音。
最初日本的三大电信运营商各自有不同的字符定义,分别是DoCoMo、KDDI和Softbank。随着iOS内置了Softbank的版本,emoji在全球范围内风靡(iOS5版本以前)。而Google又自己定义了一套emoji字符。iOS5以后,apple采用了unicode定义的emoji字符(iOS5版本以后)。
unicode定义的emoji是四个字符,softbank为3个字符,emoji的四个字符从存储到展示对应没有做过考虑的系统来说,简直就是灾难。
3.针对unicode定义的emoji表情过滤
①.unicode定义的emoji是四个字符,根据这个原理进行过滤...
|-转 linux下安装php的Exif扩展笔记!(用LNMP一键安装脚本安装的php)
没安装Exif扩展,这个PHP安装不支持读取Exif数据。
Intervention \ Image \ Exception \ NotSupportedException
Reading Exif data is not supported by this PHP installation.
宝塔上直接安装很方便
linux安装Exif扩展
#查看已安装的扩展:
/usr/local/php/bin/php -m
#修改php配置文件,注释掉disable_functions nano /usr/local/php/etc/php.ini
安装exif扩展,进入lnmp一键安装包解压目录,解压php,进入exif目录
cd /home/lnmp1.6/src
tar -xjf php-7.2.22.tar.bz2
cd php-7.2.22/ext/exif/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
make test
nano /usr/local/php/etc/php.ini #编辑php.ini底部追加extension = exif.so #或者是去掉注释 extension=mbstring和extension=exif
/etc/init.d/php-fpm restart #重启php
/usr/local/php/bin/php -m #查看扩展是否安装成功
...
|-转 configure: error: Cannot find ldap.h 解决方法
在用wordpress时需要开启ldap,在安装php-ldap时遇见了configure: error: Cannot find ldap.h
这个报错,百度了你知道的都是一个答案,尝试了不好使。
终于在必应上看到了另一种解决方式 apt-get install libldap2-dev
然后就ok了。记录一下吧。...
|-转 一个PHP针对数字的加密解密类
<?php
namespace app;
/**
* 加密解密类
* 该算法仅支持加密数字。比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密。
* @author 深秋的竹子
* @version alpha
* @加密原则 标记长度 + 补位 + 数字替换
* @加密步骤:
* 将a-z,A-Z,0-9 62个字符打乱,取前M(数字最大的位数)位作为 标记长度字符串,取第M+1 到第M+10位为数字替换字符串,剩余的为补位字符串
* 1.计算数字长度n,取乱码的第n位作为标记长度。
* 2.计算补位的长度,加密串的长度N -1 - n 为补位的长度。根据指定的算法得到补位字符串。
* 3.根据数字替换字符串替换数字,得到数字加密字符串。
* 标记长度字符 + 补位字符串 + 数字加密字符串 = 加密串
* Usage:
* $obj = new XDeode(9);
* $e_txt = $obj->encode(123);
* echo $e_txt.<br/>;
* echo $obj->decode($e_txt);
*/
class XDeode{
private $strbase = "Flpvf70CsakVjqgeWUPXQxSyJizmNH6B1u3b8cAEKwTd54nRtZOMDhoG2YLrI";
private $key,$length,$codelen,$codenums,$codeext;
// 初始化
function __construct($length = 9,$key = 2543.5415412812){
$this->key = $key;
$this->length = $length;
$this->codelen = substr($this->strbase,0,$this->length);
$this->codenums = substr($this->strbase,$this->length,10);
$this->codeext = substr($this->strbase,$this->length + 10);
}
// 编码
function encode($nums){
$rtn = "";
$numslen = strlen($nums);
//密文第一位标记数字的长度
$begin = substr($this->codelen,$numslen - 1,1);
//密文的扩展位
$extlen = $this->length - $numslen - 1;
$temp = str_replace(., , $nums / $this->key);
$temp = substr($temp,-$extlen);
$arrextTemp = str_split($this->codeext);
$arrext = str_split($temp);
foreach ($arrext as $v) {
$rtn .= $arrextTemp[$v];
}
$arrnumsTemp = str_split($this->codenums);
$arrnums = str_split($nums);
foreach ($arrnums as $v) {
$rtn .= $arrnumsTemp[$v];
}
return $begin.$rtn;
}
//解码
function decode($code){
$begin = substr($code,0,1);
$rtn = ;
$len = strpos($this->codelen,$begin);
if($len!== false){
$len++;
$arrnums = str_split(substr($code,-$len));
foreach ($arrnums as $v) {
$rtn .= strpos($this->codenums,$v);
}
}
return $rtn;
}
}
?>
一个PHP针对数字的加密解密类,该类仅支持加密数字。比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密,需要的朋友可以参考下:...
|-原 php的Memcache addServer 后set失败
遇到的问题
$m = new Memcache; $m->connect('localhost', 11211); // $m->addServer('localhost', 11211); // echo $m->getServerStatus('localhost', 11211);die; // var_dump($m);die; $m->set('foo','11'); var_dump($m->get('foo'));die; echo $m->get('foo');die;
一直是无法set成功...
|-转 PHP8 报错Required parameter $r follows optional parameter
上面这种写法在PHP5-PHP7下不报错,但在PHP8下报错正确的方法是有默认值的参数必须放在任何非默认参数的右侧即改成如下:
在PHP8时,后台会有Deprecated: Required parameter $r follows optional parameter $haveclass in connect.php这样的错误。
查起原因,PHP8下对函数的默认参数的顺序比较严格,
比如connect.php 3073行代码:
//替换列表模板/标签模板/搜索模板 function ReplaceListVars($no,$listtemp,$subnews,$subtitle,$formatdate,$url,$haveclass=0,$r,$field,$docode=0){
上面这种写法在PHP5-PHP7下不报错,但在PHP8下报错正确的方法是有默认值的参数必须放在任何非默认参数的右侧即改成如下:
function ReplaceListVars($no,$listtemp,$subnews,$subtitle,$formatdate,$url,$r,$field,$haveclass=0,$docode=0){ global $empire,$public_r,$class_r,$class_zr,$fun_r,$dbtbpre,$emod_r,$class_tr,$level_r,$navclassid,$etable_r; if($haveclass)
发布于 2022-02-15 20:44 ...
|-转 php执行shell不阻塞方法
大家都知道php执行系统命令的方法有: system() 输出并返回最后一行shell结果。 exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
这些方法都会等待命令执行完毕后才会继续执行后续的程序 不阻塞可以将命令输出的内容写入系统的一个回收站文件,这样程序就不会阻塞 例如:
shell_exec("/use/local/php/bin/php /www/t.php > /dev/null 2>&1 &");
shell中可能经常能看到:>/dev/null 2>&1
命令的结果可以通过%>的形式来定义输出
/dev/null 代表空设备文件
代表重定向到哪里,例如:echo “123” > /home/123.txt 1 表示stdout标准输出,系统默认值是1,所以”>/dev/null”等同于”1>/dev/null” 2 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么本文标题的语句: 1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。 2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。...