Compilation failed: character value in \x{...} sequence is too large at offset xxx

PHPliuliangsong 发表了文章 • 0 个评论 • 341 次浏览 • 2016-10-18 14:48 • 来自相关话题

当我们使用正则表达式匹配汉字时,收到一条警告信息,如:<?php
echo preg_replace("#[^\x{4e00}-\x{9fa5}]#", "", '爱E族:aiezu.com');
//抛出警告:
// PHP Warning: preg_replace(): Compilation failed: character value in \x{...} sequence is too large at offset 9 in /tmp/aiezu.com.php on line 2  这是由于我们正则表达式没加"u"模式原因,如果没加"u"模式,"\x"后的大括号中最多只能包含两个字符,范围为:"\x{00}-\x{ff}",表示匹配ascii字符,所以上面错误的解决方法就是加上"u"模式,修改后代码如下:<?php
echo preg_replace("#[^\x{4e00}-\x{9fa5}]#u", "", '爱E族:aiezu.com');
//输出: 爱族 查看全部
当我们使用正则表达式匹配汉字时,收到一条警告信息,如:
<?php
echo preg_replace("#[^\x{4e00}-\x{9fa5}]#", "", '爱E族:aiezu.com');
//抛出警告:
// PHP Warning: preg_replace(): Compilation failed: character value in \x{...} sequence is too large at offset 9 in /tmp/aiezu.com.php on line 2
  这是由于我们正则表达式没加"u"模式原因,如果没加"u"模式,"\x"后的大括号中最多只能包含两个字符,范围为:"\x{00}-\x{ff}",表示匹配ascii字符,所以上面错误的解决方法就是加上"u"模式,修改后代码如下:
<?php
echo preg_replace("#[^\x{4e00}-\x{9fa5}]#u", "", '爱E族:aiezu.com');
//输出: 爱族

Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset 3 in xxx

PHPliuliangsong 发表了文章 • 0 个评论 • 586 次浏览 • 2016-10-18 14:18 • 来自相关话题

当我们辛辛苦苦的在网上找到匹配汉字的正则表达式拿来用时,才发现不能用,如下面代码:<?php
echo preg_replace("#[^\u4e00-\u9fa5]#", "", '爱E族:aiezu.com');代码抛出如下警告信息:PHP Warning: preg_replace(): Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset 3 in /tmp/aiezu.com.php on line 2 
解决办法:
  原来上面代码的"\u4e00-\u9fa5"是javascript中用来匹配汉字的,在PHP中应该改成"\x"开头,并使用大括号括起来:"\x{4e00}-\x{9fa5}",并在正则表达式上使用"u"模式(UTF8模式),详见下面代码:<?php
echo preg_replace("#[^\x{4e00}-\x{9fa5}]#u", "", '爱E族:aiezu.com');
//输出结果:爱族 查看全部
当我们辛辛苦苦的在网上找到匹配汉字的正则表达式拿来用时,才发现不能用,如下面代码:
<?php
echo preg_replace("#[^\u4e00-\u9fa5]#", "", '爱E族:aiezu.com');
代码抛出如下警告信息:
PHP Warning:  preg_replace(): Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset 3 in /tmp/aiezu.com.php on line 2
 
解决办法:
  原来上面代码的"\u4e00-\u9fa5"是javascript中用来匹配汉字的,在PHP中应该改成"\x"开头,并使用大括号括起来:"\x{4e00}-\x{9fa5}",并在正则表达式上使用"u"模式(UTF8模式),详见下面代码:
<?php
echo preg_replace("#[^\x{4e00}-\x{9fa5}]#u", "", '爱E族:aiezu.com');
//输出结果:爱族

Javascript计算字符串长度,中文长度为2,英文为1

Javascriptliuliangsong 发表了文章 • 0 个评论 • 636 次浏览 • 2016-10-18 11:46 • 来自相关话题

  使用js计算字符串长度,ASCII字符(英文、数字、字母等)长度算1,非ASCII字符(汉字等多字节字符)长度算2:
 
方法:将非ascii字符替换成两个星号,再计算长度:function abslength( str ) {
return str.replace(/[^\x00-\xff]/ig, '**').length;
}
alert(abslength("爱E族: aiezu.com")); //弹出16
这是JS版本,要使用PHP按同样规则计算字符串长度,请参考:PHP计算字符串长度,中文长度为2,英文为1 查看全部
  使用js计算字符串长度,ASCII字符(英文、数字、字母等)长度算1,非ASCII字符(汉字等多字节字符)长度算2:
 
方法:将非ascii字符替换成两个星号,再计算长度:
function abslength( str ) {
return str.replace(/[^\x00-\xff]/ig, '**').length;
}
alert(abslength("爱E族: aiezu.com")); //弹出16

这是JS版本,要使用PHP按同样规则计算字符串长度,请参考:PHP计算字符串长度,中文长度为2,英文为1

PHP计算字符串长度,中文长度为2,英文为1

PHPliuliangsong 发表了文章 • 0 个评论 • 443 次浏览 • 2016-10-18 11:19 • 来自相关话题

  PHP计算字符串长度,ASCII字符(英文、数字、字母等)长度算1,非ASCII字符(汉字等多字节字符)长度算2:
方法一:
  将非ascii字符替换成两个星号,再使用strlen计算长度:<?php
function abslength( $str ) {
return strlen(preg_replace("#[^\x{00}-\x{ff}]#u", '**', $str));
}
echo abslength("爱E族: aiezu.com"); //输出16
方法二:
  循环判断每个字符是否为ASCII字符,是则加1,否则加2:<?php
function abslength($s){
$n = 0;
preg_match_all("/./us",$s,$matchs);
foreach($matchs[0] as $p){
$n += preg_match('#^['.chr(0x1).'-'.chr(0xff).']$#',$p) ? 1 : 2;
}
return $n;
}
echo abslength("爱E族: aiezu.com"); //16 
  这是PHP版本,要使用JS按同样规则计算字符串长度,请参考:Javascript计算字符串长度,中文长度为2,英文为1 查看全部
  PHP计算字符串长度,ASCII字符(英文、数字、字母等)长度算1,非ASCII字符(汉字等多字节字符)长度算2:
方法一:
  将非ascii字符替换成两个星号,再使用strlen计算长度:
<?php
function abslength( $str ) {
return strlen(preg_replace("#[^\x{00}-\x{ff}]#u", '**', $str));
}
echo abslength("爱E族: aiezu.com"); //输出16

方法二:
  循环判断每个字符是否为ASCII字符,是则加1,否则加2:
<?php
function abslength($s){
$n = 0;
preg_match_all("/./us",$s,$matchs);
foreach($matchs[0] as $p){
$n += preg_match('#^['.chr(0x1).'-'.chr(0xff).']$#',$p) ? 1 : 2;
}
return $n;
}
echo abslength("爱E族: aiezu.com"); //16
 
  这是PHP版本,要使用JS按同样规则计算字符串长度,请参考:Javascript计算字符串长度,中文长度为2,英文为1

PHP中eval函数导致HTTP 500错误的解决方法

PHPliuliangsong 发表了文章 • 0 个评论 • 292 次浏览 • 2016-10-18 11:10 • 来自相关话题

  使用php eval函数来执行PHP代码时,常常由于提交给eval函数执行的代码不是合法的PHP代码,而导致http服务返回"HTTP/1.0 500 Internal Server Error"错误。尝试使用下面方式进行异常处理:try {
eavl("code...");
} catch(Exception $e){}或者:@eavl("code...");后发现页面依然返回http 500错误,在网上google一下才发现这是一个bug,通过下面方式得以解决:ini_set('display_errors', 'on');
try {
eavl("code...");
} catch(Exception $e){}
ini_set('display_errors', 'on');或者:ini_set('display_errors', 'on');
@eavl("code...");
ini_set('display_errors', 'off'); 查看全部
  使用php eval函数来执行PHP代码时,常常由于提交给eval函数执行的代码不是合法的PHP代码,而导致http服务返回"HTTP/1.0 500 Internal Server Error"错误。尝试使用下面方式进行异常处理:
try {
eavl("code...");
} catch(Exception $e){}
或者:
@eavl("code...");
后发现页面依然返回http 500错误,在网上google一下才发现这是一个bug,通过下面方式得以解决:
ini_set('display_errors', 'on');
try {
eavl("code...");
} catch(Exception $e){}
ini_set('display_errors', 'on');
或者:
ini_set('display_errors', 'on');
@eavl("code...");
ini_set('display_errors', 'off');

PHP通过http头user-agent判断是否为手机浏览器

PHPliuliangsong 发表了文章 • 0 个评论 • 568 次浏览 • 2016-10-18 11:03 • 来自相关话题

下面PHP自定义函数可以根据http头user-agent判断是否为手机访问,如果是则返回true:
<?php
/**
* 判断是否是通过手机访问
* @return bool 是否是移动设备
*/
public function isMobile() {
//判断手机发送的客户端标志
if(isset($_SERVER['HTTP_USER_AGENT'])) {
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$clientkeywords = array(
'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', ''
,'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu',
'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini',
'operamobi', 'opera mobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'
);
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
if(preg_match("/(".implode('|',$clientkeywords).")/i",$userAgent)&&strpos($userAgent,'ipad') === false)
{
return true;
}
}
return false;
}
 附各移动浏览器的http user-agent:
一、微信的http user-agent(关键词MicroMessenger)
1、Iphone(苹果)平台微信的ucweb的useragent:
Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko)
Mobile/9B176 MicroMessenger/4.3.22、Android(安卓)平台微信的useragent:Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1
(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255
 二、UC浏览器的http user-agent(关键词UCWEB)1、 android平台:
android平台ucweb急速模式开启下ucweb浏览器useragent:UCWEB/2.0 (Linux; U; Adr 2.3; zh-CN; MI-ONEPlus) U2/1.0.0 UCBrowser/8.6.0.199 U2/1.0.0 Mobileandroid平台ucweb急速模式关闭状态下的http_user_agent:Mozilla/5.0 (Linux; U; Android 2.3; zh-CN; MI-ONEPlus) AppleWebKit/534.13 (KHTML, like Gecko)
UCBrowser/8.6.0.199 U3/0.8.0 Mobile Safari/534.13 2、iPhone 平台
iPhone 平台极速模式开启状态下ucweb浏览器useragent:UCWEB/2.0 (iOS; U; iPh OS 4_3_2; zh-CN; iPh4) U2/1.0.0 UCBrowser/8.6.0.199 U2/1.0.0 Mobile iPhone 平台极速模式关闭状态下 UA 示例如下:(OBUA 为自带浏览器 UA)OBUA UCBrowser/8.6.0.199 Mobile3、iPad 平台
ipad平台下ucweb浏览器useragent:Mozilla/5.0 (iPad; U; CPU OS 6_0 like Mac OS X; zh-CN; iPad2) AppleWebKit/534.13
(KHTML, like Gecko) UCBrowser/8.6.0.199 U3/0.8.0 Safari/534.13  查看全部
下面PHP自定义函数可以根据http头user-agent判断是否为手机访问,如果是则返回true:
<?php
/**
* 判断是否是通过手机访问
* @return bool 是否是移动设备
*/
public function isMobile() {
//判断手机发送的客户端标志
if(isset($_SERVER['HTTP_USER_AGENT'])) {
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$clientkeywords = array(
'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', ''
,'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu',
'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini',
'operamobi', 'opera mobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'
);
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
if(preg_match("/(".implode('|',$clientkeywords).")/i",$userAgent)&&strpos($userAgent,'ipad') === false)
{
return true;
}
}
return false;
}

 附各移动浏览器的http user-agent:
一、微信的http user-agent(关键词MicroMessenger)
1、Iphone(苹果)平台微信的ucweb的useragent:
Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) 
Mobile/9B176 MicroMessenger/4.3.2
2、Android(安卓)平台微信的useragent:
Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 
(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255

 二、UC浏览器的http user-agent(关键词UCWEB)1、 android平台:
android平台ucweb急速模式开启下ucweb浏览器useragent:
UCWEB/2.0 (Linux; U; Adr 2.3; zh-CN; MI-ONEPlus) U2/1.0.0 UCBrowser/8.6.0.199 U2/1.0.0 Mobile
android平台ucweb急速模式关闭状态下的http_user_agent:
Mozilla/5.0 (Linux; U; Android 2.3; zh-CN; MI-ONEPlus) AppleWebKit/534.13 (KHTML, like Gecko) 
UCBrowser/8.6.0.199 U3/0.8.0 Mobile Safari/534.13
2、iPhone 平台
iPhone 平台极速模式开启状态下ucweb浏览器useragent:
UCWEB/2.0 (iOS; U; iPh OS 4_3_2; zh-CN; iPh4) U2/1.0.0 UCBrowser/8.6.0.199 U2/1.0.0 Mobile 
iPhone 平台极速模式关闭状态下 UA 示例如下:(OBUA 为自带浏览器 UA)
OBUA UCBrowser/8.6.0.199 Mobile
3、iPad 平台
ipad平台下ucweb浏览器useragent:
Mozilla/5.0 (iPad; U; CPU OS 6_0 like Mac OS X; zh-CN; iPad2) AppleWebKit/534.13 
(KHTML, like Gecko) UCBrowser/8.6.0.199 U3/0.8.0 Safari/534.13
 


javascript微博内容字数统计

Javascriptlinyu520 发表了文章 • 0 个评论 • 295 次浏览 • 2016-10-17 21:18 • 来自相关话题

  下面是计算微博内容字数的自定义函数。计算规则为URL算11,中文汉字长度为1,英文、数字、标点符号等单字节字符算0.5:function strlen(str) {
var value = str.replace(/(^\s*)|(\s*$)/g, "");
var reg = new RegExp('((news|telnet|nttp|file|http|ftp|https)://){1}(([-A-Za-z0-9]+(\\.[-A-Za-z0-9]+)*(\\.[-A-Za-z]{2,5}))|([0-9]{1,3}(\\.[0-9]{1,3}){3}))(:[0-9]*)?(/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*)*', 'gi');
value = value.replace(reg, '**********************');
return Math.ceil(value.replace(/[^\x00-\xff]/ig, "**").length / 2);
}
alert(strlen('爱E族网址为: http://aiezu.com')); //弹出18 查看全部
  下面是计算微博内容字数的自定义函数。计算规则为URL算11,中文汉字长度为1,英文、数字、标点符号等单字节字符算0.5:
function strlen(str) {
var value = str.replace(/(^\s*)|(\s*$)/g, "");
var reg = new RegExp('((news|telnet|nttp|file|http|ftp|https)://){1}(([-A-Za-z0-9]+(\\.[-A-Za-z0-9]+)*(\\.[-A-Za-z]{2,5}))|([0-9]{1,3}(\\.[0-9]{1,3}){3}))(:[0-9]*)?(/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*)*', 'gi');
value = value.replace(reg, '**********************');
return Math.ceil(value.replace(/[^\x00-\xff]/ig, "**").length / 2);
}
alert(strlen('爱E族网址为: http://aiezu.com')); //弹出18

apache将搜索引擎抓取日志记录到独立的日志文件

Linuxlinyu520 发表了文章 • 0 个评论 • 228 次浏览 • 2016-10-17 21:13 • 来自相关话题

  我们做SEO的时候,常常希望知道搜索引擎爬虫什么时候光顾了我们的网站,这时我们就可以同下面的方法,将搜索引擎的抓取日志单独放在一个日志文件中。

1、 识别搜索引擎:
在“/etc/httpd/conf/httpd.conf”文件“LogFormat”前面添加如下内容,用来判断是蜘蛛抓取还是真实用户访问:SetEnvIfNoCase User-Agent "(Googlebot|Mediapartners-Google|Baiduspider|MSNBot|sogou spider|Sosospider|YodaoBot|Yahoo|Yahoo)" robot
2、 定义日志格式:
在“httpd.conf”文件“LogFormat”下面添加一行,设置一个新的日志格式:LogFormat "%{%Y-%m-%d %H:%M:%S}t %>s %V %h %b %r \"%{User-agent}i\" \"%{Referer}i\"" big
3、 记录搜索引擎日志:
如果服务器上面架了多个站点,就在"VirtualHost"中新增下面一行,否则就在httpd.conf中“CustomLog”下面新增下面一行:CustomLog logs/aiezu.com-robot big env=robot上面的big是第二步定义的日志格式,robot是第一步的判断是否为搜索引擎的变量。

4、测试配置文件并重新加载配置文件:httpd -t
service httpd reload 查看全部
  我们做SEO的时候,常常希望知道搜索引擎爬虫什么时候光顾了我们的网站,这时我们就可以同下面的方法,将搜索引擎的抓取日志单独放在一个日志文件中。

1、 识别搜索引擎:
在“/etc/httpd/conf/httpd.conf”文件“LogFormat”前面添加如下内容,用来判断是蜘蛛抓取还是真实用户访问:
SetEnvIfNoCase User-Agent "(Googlebot|Mediapartners-Google|Baiduspider|MSNBot|sogou spider|Sosospider|YodaoBot|Yahoo|Yahoo)" robot

2、 定义日志格式:
在“httpd.conf”文件“LogFormat”下面添加一行,设置一个新的日志格式:
LogFormat "%{%Y-%m-%d %H:%M:%S}t %>s %V %h %b %r \"%{User-agent}i\" \"%{Referer}i\"" big

3、 记录搜索引擎日志:
如果服务器上面架了多个站点,就在"VirtualHost"中新增下面一行,否则就在httpd.conf中“CustomLog”下面新增下面一行:
CustomLog logs/aiezu.com-robot big env=robot
上面的big是第二步定义的日志格式,robot是第一步的判断是否为搜索引擎的变量。

4、测试配置文件并重新加载配置文件:
httpd -t
service httpd reload

linux进程资源占用高原因分析命令

Linuxlinyu520 发表了文章 • 0 个评论 • 200 次浏览 • 2016-10-17 18:46 • 来自相关话题

1、查看进程的线程:ps -eLf|egrep 'httpd'
 2、跟踪线程调用:strace -p 15530
3、统计线程中函数的调用小号CPU时间:strace -p 16334 -c
strace -p 15530 -o out.file #输出到out.file文件
4、只显示recv函数的调用:strace -p 5314 -f -F -e recv
5、gdb调试线程:gdb -p pid
6、查看线程打开的文件描述符:lsof -p pid  查看全部
1、查看进程的线程:
ps -eLf|egrep 'httpd'

 2、跟踪线程调用:
strace -p 15530

3、统计线程中函数的调用小号CPU时间:
strace  -p 16334 -c
strace -p 15530 -o out.file #输出到out.file文件

4、只显示recv函数的调用:
strace  -p 5314 -f -F -e recv

5、gdb调试线程:
gdb -p pid

6、查看线程打开的文件描述符:
lsof -p pid
 

Mysql错误Too many connections的解决方法

Mysqllinyu520 发表了文章 • 0 个评论 • 269 次浏览 • 2016-10-17 17:21 • 来自相关话题

  连接mysql时报too many connections错误,是因为同时打开连接太多、超过设置文件限制所致。通过show processlist你会发现有很多sleep连接,这是因为使用了长连接(mysql_pconnect)或者短连接(mysql_connect)未正常关闭导致的。

  这时你需要检查程序代码,看是否有未正常关闭mysql连接,同时优化执行过慢的SQL语句。确定程序没问题时,修改mysql配置文件,加大mysqld的最大连接数,同时设置一个短的超时时间,让短连接尽快的自动关闭即可解决次问题:

修改/etc/my.cnf,添加下面内容,并重启mysqld服务即可:max_connections = 500 #由默认的150改成500个连接
wait_timeout=600 #由默认的2880改为600秒
interactive_timeout = 600 #由默认的2880改为600秒当然,加大连接数需要谨慎,设置够大,当同时打开的连接数太多时,有可能导致服务器内存不够而当机。
  查看全部
  连接mysql时报too many connections错误,是因为同时打开连接太多、超过设置文件限制所致。通过show processlist你会发现有很多sleep连接,这是因为使用了长连接(mysql_pconnect)或者短连接(mysql_connect)未正常关闭导致的。

  这时你需要检查程序代码,看是否有未正常关闭mysql连接,同时优化执行过慢的SQL语句。确定程序没问题时,修改mysql配置文件,加大mysqld的最大连接数,同时设置一个短的超时时间,让短连接尽快的自动关闭即可解决次问题:

修改/etc/my.cnf,添加下面内容,并重启mysqld服务即可:
max_connections = 500 #由默认的150改成500个连接
wait_timeout=600 #由默认的2880改为600秒
interactive_timeout = 600 #由默认的2880改为600秒
当然,加大连接数需要谨慎,设置够大,当同时打开的连接数太多时,有可能导致服务器内存不够而当机。