正则表达式实战(PHP版)

正则表达式非常强大,但也很难学。花点功夫是值得的。用Netbeans IDE Early Access for PHP虽然因为原来用它做过JAVA的缘故很容易上手,但调试不易让me这个新手学习进度很慢,因为要不停的试错试错再试错,效率很低。昨天装了Zend Studio后感觉太爽了,调试很好用。那就开始吧,解开me一直的心结——正则表达式。

正则表达式是一种可以用于模式匹配和替换的强有力的工具,英文叫Regular Expression,在POSIX中扩充为Extended Regular Expression,简称ereg。ereg共有三种形式:

  1. ereg。默认被php支持,是基础库的一部分,但是对一些新的正则表达式特性不支持,比如lazy模式等。不要被这个Extended迷惑了,要知道POSIX可是1986年制定的。
  2. mb_ereg。是ereg的变体,支持多字节字符(比如中韩日字体编码)。另外一种对多字节的支持方式是preg,需要带上/u修正符(php的4.20版本后有效)。
  3. preg。这个p指的是perl,也就是兼容perl语法的正则表达式。要支持preg需要编译PCRE库,或者直接在服务器端安装。

以上三种形式ereg是兼容性最强的,因为是从基础函数库层面支持的;但preg功能更丰富,速度也快;mb_ereg则对多字节字符支持的很好。比如“中国”的编码是“D6D0B9FA”,用ereg(‘/./’,$str)返回D6,如果设定字符编码后用mb_eregx_encoding(“CP936”)就可以返回正确的结果“中”。如果php脚本用的utf-8编码,则可以通过/u修正符来匹配多字节字符。

弄清楚了来龙去脉,下面实战。

、\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b 用来匹配电子邮件地址,比如xxx@gmail.com;

二、preg_match(string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]])返回整数,0则说明未匹配成功,1则说明匹配成功,并会把匹配结果存入$matches中,其中matches[0]存储全匹配结果,mataches[1]则存储子模板匹配结果,其中子模板指的是模板中用括号括起来的部分。示例如下:

preg_match(‘@^(?:http://)?([^/]+)@i‘,”http://www.php.net/index.html”, $matches);
print_r($matches);

输出:Array ( [0] => http://www.php.net [1] => www.php.net )

正则表达式详解:@^(?:http://)?([^/]+)@i@是模板限定符,这个可以是其他的比如\/等,因为此模板中有//需要匹配,所以要用不同于/的@,当然其他也行;i是修正符,指的是忽略大小写;^,指必须位于行首;(?:http://),是子模板,其中的代表此子子模板的匹配项不存入matches,仅仅匹配就行了,没有这个,则Array[1]应该是http://;第二个指的前面的模板出现0次或1次;([^/]+)又是一个子模板,匹配/+则代表需要出现一次或多次。

再来一次:

preg_match(‘@^(http://)?([^/]+)@i’,”http://www.php.net/index.html”, $matches);
print_r($matches);

输出:Array ( [0] => http://www.php.net [1] => http:// [2] => www.php.net )

我们再举个其他例子:32选7第2006095期 04091316242830+25 ,提取其中的中奖号码包括特别号。

preg_match(“@((0[1-9]|[1-9][0-9]){7})(?:[+])(0[1-9]|[1-9][0-9])@“,$str,$matches);
print_r($matches);
输出:Array ( [0] => 04091316242830+25 [1] => 04091316242830 [2] => 30 [3] => 25 )

详解:((0[1-9]|[1-9][0-9]){7})用来匹配04091316242830,其中的(0[1-9]|[1-9][0-9])用来匹配两位数字,比如03、32之类的,{7}要求必须出现七次,整体用()括起来是为了让这个结果存入matches中;(?:[+])用来匹配+号,?:则是为了仅匹配而不存入matches。

刚才的结果中Array[2]=>30,是中奖号的最后一个数字,对我们没有任何意义,要想得到中奖号和特别号,其他统统不要怎么办。把正则表达式写成这样:@((?:0[1-9]|[1-9][0-9]){7})(?:[+])(0[1-9]|[1-9][0-9])@,OK了,输出:Array ( [0] => 04091316242830+25 [1] => 04091316242830 [2] => 25 )。

【2008年11月26日更新】

在处置恶意访问ip的时候,用到了如下的正则:@^(\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:\d{1,3})?)(\s+evil)?$@i,用来匹配形如121.22.23.23 evil,把匹配结果存入数组后$matches[1]是121.22.23.23,$matches[2]则是空格加evil。

三、解決StatPressCN的永固鏈接和页面请求匹配处理问题

WordPress出于用户友好的角度出发,允许blogger自己设定永固链接以让页面网址对用户更友好(默认是?p=234,确实够不友好的)。在StatPressCN中记录页面访问时需要识别到底是哪篇文章被访问了,以方便准确统计数据。这中间就存在一个永固链接结构变更的问题,比如原来设定的是/2008/09/statpresscn.html,后来改为/2008/09/12/statpresscn.html。统计工具只会记录当时的网址,它不会理会到底是哪篇文章被访问了。me提供了一个解决方案就是在进入统计数据库的时候根据当前的永固链接结构识别文章的id并记录,这样无论如何更改永固链接结构,都可以正确显示到底是哪篇文章被访问了,做数据统计分析的时候肯定更全面客观准确。

根据永固链接结构来解析被访问网址(也就是页面请求),获得文章在WordPress数据库中的id。me虽然感觉可以通过正则表达式解决,但因为当时不会用(很严重的畏难情绪),只好用最笨的办法:一个个数看%postname%在永固链接结构/%year%/%month%/%day%/%postname%.html的位置(其实是查斜杠/的次数),然后在被访问网址中查到相应的位置,提取该文章的postname,然后再反查post数据库,得到文章id。这个方法虽然暂时可以解决问题,但很不完善,也存在一定的风险。比如说,如果有人把永固链接结构设为/%year%%postname%.html了,那查斜杠/的方式就完全失效;即使大家规规矩矩把变量用斜杠/隔起来,那也无法排除部分在链接中添加个人语句的可能,比如me为了宣传自己的大名,完全可以设定永固链接结构为/%year%%month%/%day%/%postname%heart5.html的样子,那通过最后一个斜杠和html前的小数点.获取的postname就是无效的,当然也不可能通过post数据库反查出id来。学习了正则表达式,嘿,问题就好办了。

function heart5_get_post_name_or_id($url,$per_struct){
$per_str_reg = preg_replace(“@%([\w%-]+)%@”,”(?<$1>[\w%-]+)”,$per_struct);//[\w%-]代表任何数字字母以及百分号%和减号-,这是链接地址中允许出现的字符。第二个参数是提取第一个得到的变量名并替换为正则表达式,同时用该变量做key,得到形如(?<postname>[\w%-]+)。本语句是替换永固俩接结构为正则表达式用于以后的变量提取。
$per_str_reg = “@^”.$per_str_reg.”$@”;//装配成正则表达式
preg_match($per_str_reg,$url,$matches);//进行匹配
if(key_exists(“post_id”,$matches)){//先看是否能得到postid,如得到则返回
return $matches[“post_id”];
}else if(key_exists(“postname”,$matches)){//再看是否能得到postname,如得到则返回
return $matches[“postname”];
}
return false;//匹配不成功则返回false
}

在处理形如/2008/09/12/statpresscn.html的链接匹配时因为遗漏了小数点.的处理,写成了[\w/%-]结果一直无法匹配成功,后来才发现原来还需要匹配小数点.,唉。正确的应该写成[\w\./%-]。

参考资料:

正则表达式中的特殊字符

正则表达式使用详解

正则表达式参考文档

over

垃圾搜索Windows Live的真面目

比尔盖茨退休了,巴尔默上台了,微软出现了新变化,盗版用户的操作系统桌面开始黑屏了。虽然黑屏方式非常愚蠢,但me并不认为打击盗版是不应该的,不管是不是微软牵头,在版权维护方面,me一直态度明确且坚决。微软是很多人(尤其是所谓电脑技术型高级用户)不喜欢,me也很不喜欢。me不喜欢它是有原因的,两年半前因为强行捆绑msn和浏览器IE关联让me恶心的不行,写了篇无可奈何花落去--微软的集成方式,今天,因为它的恶意搜索机器人泛滥,严重干扰了搜索引擎市场份额的精确统计,并且对所有网站构成了洪水攻击,me要写这篇垃圾搜索windows live的真面目。对坏蛋,要坚决斗争之,呵呵。

查阅后台来访统计(me当然用的是me自己开发的StatPressCN啦,呵呵)数据时,发现有不少来自微软live.com搜索引擎的关键词太过普通(比如twitter、april、reply等),于是奇怪起来,me何德何能,居然在如此常见的关键词搜索中排名靠前。但诡异的是,me点击到来源的参考页面(也就是live.com)去,翻了n页都没有找到“天高云淡”的身影。仔细检查网址和关键词,都没有错啊,真是出鬼了。

一直没有功夫弄清楚这个问题,现在StatPressCN的主体功能开发终于告一段落。出于对数据精确性的高标准严要求,me再次沉静下来努力把它搞清楚。

StatPressCN中以搜索引擎、参考页面和IP为关键词进行搜索,得到如下结果:

Windows Live 59.108.96.22 http://cnweb.search.live.com/results.aspx?q=%E5%85%B3%E4%BA%8EBaidu%E5%92%8CGoogle&form=QBRE3
Windows Live 61.148.115.186 http://cnweb.search.live.com/results.aspx?q=%E8%89%BA%E6%9C%AF+%E7%94%9F%E6%B4%BB++%E5%90%8D%E8%A8%80&form=QBRE
Windows Live 61.178.180.181 http://search.live.com/results.aspx?q=%E5%8C%85%E5%90%AB%E6%98%9F%E6%9C%9F%E5%86%9C%E5%8E%86%E7%9A%84%E5%88%B7%E6%9C%BA%E5%8C%85&src=IE-SearchBox
Windows Live 61.183.129.114 http://search.live.com/results.aspx?q=motorola+a1200+%E5%A4%A9%E9%AB%98%E4%BA%91%E6%B7%A1&go=&form=QBRE
Windows Live 64.111.114.111 http://cnweb.search.live.com/results.aspx?q=twitter&go=&form=QBRE
Windows Live 65.55.109.10 http://search.live.com/results.aspx?q=gtalk
Windows Live 65.55.109.100 http://search.live.com/results.aspx?q=april&form=QBHP
Windows Live 65.55.109.100 http://search.live.com/results.aspx?q=print&form=QBHP
Windows Live 65.55.109.100 http://search.live.com/results.aspx?q=twitter
Windows Live 65.55.109.100 http://search.live.com/results.aspx?q=twitter&form=QBHP
Windows Live 65.55.109.101 http://search.live.com/results.aspx?q=twitter

奇怪的是那些看起来无效的搜索都源自某些有规律的IP,形如65.55.109.10、65.55.109.100、65.55.109.101等。拿65.55.109.35做关键词在Google中搜索了下,发现这个IP好像来自己微软官方。这就奇怪了,既然是微软官方的,并且号称搜索引擎,那为什么都是无效搜索呢。

拿live.com query term在Google中搜索,没有找到有价值的信息,继续拿live.com search term identify做关键词在Google中搜索,终于找到了相关研究和信息。让我们来看看是怎么回儿事儿。

有人发现了和me类似的情况—— Live.com Sexually Explicit Search Terms症状也是无效搜索来源,本以为是其他冒牌伪装的垃圾访问,后来确实是微软官方行为后,还以为是微软为了防止两性类话题而做的额外检查,另外一个帖子讨论结果认为可能是微软在完善自己的live.com搜索引擎时手动检查结果而导致的不良访问。大家主观上还是没有恶意冤枉微软意图的。

The Art of Web的仔细分析和研究彻底暴露了这件事的真相:此事是微软官方行为,属恶意或者不负责任的垃圾访问,有靠此行为认为提高市场份额统计数据的作假嫌疑,且行动是隐秘进行的,持续时间很长了,更严重的是在网友批露后变换了代码仍然在搞。据说微软官方进行了回应,不但不道歉,不按照行业规矩接受机器人协议,还希望大家能接受它这种行为,并且以可能会丧失掉来自live.com的流量为由威胁大家不要屏蔽它,呵呵,自我感觉真好啊,真够无耻啊。

刚在Google的市场份额还在叹息windows live的份额也下滑了,没想到就这十几个点的占有率也是掺了大水份的啊!想想微软这么大的块头和高级的技术平台,感觉真够滑稽的。当看戏了,闹剧啊!

刚又在数据库中搜了下,发现以65.55.109.开头的IP几乎全部涉案。建议大家把来自search.live.com且IP以65.55.109.开头的所有来访全部屏蔽了吧。

——————————————(更新:2008年10月27日)

已经升级了StatPressCN,删除了687条来自Windows live的无效搜索数据(有效的当然要保留),并且能够识别无效来访,在统计系统中不做记录。

—————————————(更新:2008年10月27日)

StatPressCN中统计系统更新(StatPressUpdate)后,发现还有不少Windows Live的无效搜索,检查发现以65.55.110开头的IP也全军覆没了。更新banip.dat数据后在进行统计系统升级,又删除了785条记录。再看搜索引擎占比(即市场份额约数),Windows Live立马从两位数降为个位数了,最近三十天的搜索占比为2.8%,所有统计时间内的占比为4.6%。又发现65.55.165和65.55.232也全军覆没了,共删除399条记录。经过如是修正后,Windows Live的占比从16%下降至了0.2%,唉,微软啊,不行就算了,何必装象呢!

—————————————(更新:2008年11月17日)

偶用中国站长网的查询工具得到如下结果:

Windows Live垃圾搜索示样
Windows Live垃圾搜索示样

百度和Google收录的是几百条,人家Windows Live可是几千条啊,呸,垃圾Live。

PHP、MYSQL编程笔记

开发StatPressCN过程中恶补PHP和MYSQL知识,水平不行,只好边干边学,呵呵。对一些基础不高深的东东简单梳理下,免得忘了下次重来。

一、MYSQL

  1. 用MYSQL语句直接修改数据。update `db_name` set `urlrequested` = replace(`urlrequested`,’\”,”) where `urlrequested` like “%\'”,把以’结尾的链接请求末尾的’去掉。replace可以保证key的连续性,如果先删除后添加就没有这个好处了。
  2. 插入记录。INSERT INTO users(name, age) VALUES(‘姚明’, 25), (‘比尔.盖茨’, 50), (‘火星人’, 600);如果values中为空,则添加默认值为基础的记录。
  3. 更新记录。需要配合where条件判断。UPDATE users SET age = 30 WHERE id = 12;以上语句都很危险,如果where没有设置的话会更新所有的数据记录,所以在进行类似操作的时候一定要先备份,再审慎
  4. 删除数据有两个命令delete和TRUNCATE。DELETE FROM users WHERE name = ‘Mike’ ORDER BY id DESC LIMIT 6;如果有自动增加的字段,用没有where的delete和truncate都会让这个字段从0开始,如果不想这样,可以用带where 1的语句,不过那样的执行效率很多,因为需要遍历整个数据库的所有记录;删除数据时如果使用形如like ‘$tmpstr%’的语句,一定要判断下$tmpstr是否为空,否则很危险,可能删除掉所有数据,后果严重的很。
  5. 正则表达式在where语句中也可使用,好爽,这下me对正则表达式的学习可以用了。官方文档参见这里。

二、PHP

  1. 分开字符串。$p = explode(“=”,$url);
  2. 打印出数组中的所有元素。print_r($p);
  3. 计算数组中的元素个数。count($p);
  4. 数组运算,类似于java中集合的概念,很方便。生成一个空数组:$bloglist = Array();向数组中增加一个或几个元素(从末尾):array_push($bloglist,$matches[1]);添加到数组头部之前则是array_unshift($bloglist,$matches[1]) ;从数组尾部删除一个元素用array_pop(),从头部删除一个元素则用array_shift();让数组中元素唯一(即无重复元素,类似于结合set的概念):$bloglist = array_unique($bloglist);迭代输出每个元素可以在foreach中使用as:foreach($bloglist as $blog);判断某元素是否在数组中:in_array($lookingFor, $bloglist),返回布尔值真假;数组中每个元素都有个默认的key,可以这样输出看看:while (list($key,$value) = each($bloglist)) {echo “$key : $value<br>”;};还可以合并多个数组$bloglistall = array_merge($bloglist1, $bloglist2);得到两个数组的交集可用array_intersection($bloglist1, $bloglist2);差集可用array_diff($bloglist1, $bloglist2);如需要合集则先array_merge(),然后再用一次array_unique();对数组进行排序则用sort($bloglistall),默认是英文字母顺序;数组的key必须是唯一的,并且key可以设定为字符串,默认是整数。关于数组,更详细的阐释是Array的官方说明(e文版)。
  5. 奇妙的类型自动转换。print(“8&heart5″+20);输出结果为28。
  6. 字符串函数:strlen,得到字符串长度;substr($v,start_pos,length),截取指定长度的字符串,不指定长度则自动取到末尾;strripos($v,”postname”),是否包含指定子字符串,返回所处位置或;sscanf,扫描规律字符串得到相应变量;printf,格式化输出字符串;str_replace,替换子字符串;strstr,找到特定子字符串出现的位置;rtrim会删除末尾的空格和换行等字符,包括空格、\t、\n、\r、\0、\x0b;explode会自动处理行尾的空字符。
  7. 正则表达式。ereg(‘^/[0-9]{4}/[0-9]{2}/{0,1}$’,$out_url);匹配/2008/10
  8. 时间函数。println(strtotime(“now”));输出1224902867,然后用date函数格式化println(date(“c”,$d1));输出2008-10-24T18:03:42+08:00,println(date(“r”,$d1));输出Fri, 24 Oct 2008 18:03:42 +0800,如果用gmdate则输出格林威治标准时,println(gmdate(“r”,$d1));输出Fri, 24 Oct 2008 10:03:42 +0000;其中时区信息是通过date_default_timezone_set(‘prc’);设定的,prc指中国大陆,也可以是其他,有效值列表见这里;另外strtotime还可以对时间做修正,比如strtotime(“3 October 2005”)和strtotime(“1 days”,strtotime(“2 October 2005”))输出的结果都是一样的,可以用的修正符号有“+1 week 3 days 7 hours 5 seconds”,可以用+-号。
  9. file打开某个文件并把每行读入数组;fopen打开一个文件返回句柄,可以设定打开方式为读或者写,打开后内容置空;fwrite则写入内容,成功则返回true,否则是false;操作完毕后需要fclose关闭句柄。

三、WordPress

  1. get_option直接得到选项值,不用每次用mysql语句查询。
  2. get_permalink($id)得到帖子的固定链接地址,注意是包含域名的绝对路径,如果需要相对路径,则需要str_replace(get_bloginfo(“url”),””,get_permalink($id));
  3. update_option如果该项不存在会自动建立。技巧:如果不能确定某个选项是否存在,则可以先update后再delete。
  4. 数组可以一次性存入option中,存储形如a:2:{s:5:”title”;s:8:”my titile”;s:4:”body”;s:12:”Home is warm”;},a指的数组,2是元素个数,title是key名称,5是字符串长度,my titile是title的值,后面body同。
  5. 要调用插件或主题中的函数必须进入wp的主题运作机制,直接调用是无效的,出于安全考虑,同时也是因为无法得到相关环境设定和变量。官方提供的方式是模板,比如您可以自己定义一个page的新模板,然后创建page是选择新模板就可以了。模板标头有特殊要求,见这里
  6. php代码执行其实是以用户权限进行的,因为可以获取文件的在服务器上的本地地址并进行读写操作。

四、HTML

  1. 因为php可以控制输出逻辑,因此可以尽量使用html代码而不是通过php的echo或print输出,这样页面逻辑更清晰,也容易调试。
  2. 表格需要设定宽度后,表格单元中的左对齐右对齐才能起作用。
  3. input type=checkbox name=’statpress_showhotdepth’ value=’checked’ xxx

五、CSS

  1. 样式表嵌入标签的方法。<table class=’mytable’>……</table>,这种情况下mytable应该在外链的css或者当前页面自定义的css中已经定义过;或者直接写style:<table style=”outline:dotted 1px green;”>……</table>
  2. 在形如#sidebar h2{……}中,仅对那些class是sidebar中出现的h2才起作用。

StatPressCN——BLOG访问统计工具(完美支持简繁中文)

声明此插件源于Daniele LippiStatPress,me在它的基础之上进行升级开发。me以前的研究开发文章见升级StatPress的功能(完美支持中文)StatPress深度使用

插件名称:StatPressCN

最新版本:1.6.8.5(于2009年2月21日)

作者:heart5

【告示】:StatPressCN已经入驻WordPress的官方插件基地,建议大家使用官方插件基地的StatPressCN版本,那样就可以通过插件自动更新(如果访问不了可能是被光荣的墙了,直接用me提供的下载plugin-update-plus)了。当然,本帖作为开发基地,做技术探讨和交流(qq:724987115或gmail:baiyefeng@lovegmail.com)所用,仍会维护更新;另外me还维护了一个StatPressCN综合信息页面,包括下载数量和使用StatPressCN统计工具的blog清单等。

插件下载

请前往WordPress官方插件网站:WordPress Plugins -> StatPressCN

插件安装

关于安装:下载插件压缩包,把解压后得到的statpresscn目录上传至blog站点的wp-content/plugins目录下,然后在管理界面中激活StatPressCN插件即可。
关于订阅数统计:建议安装Feed Count插件(如果您通过feedburner烧录了rss的话),这样在widget中显示的订阅数就相对是全的,因为StatPressCN会读取Feed Count撷取的数据并和对您的blog原生rss的订阅数进行加总,当然如果您没有在feedburner上烧录的话也可以正常使用。

插件使用

查阅访问统计情况:最直观简单的使用就是进入blog管理界面会看到访问统计的链接,点击进入就可以看到访问信息了,功能提供如下:纵览、详情、探测以及其他辅助设置等;
扩展使用
1、如果您使用了支持widgets的WordPress模板主题,则可以直接调用StatPressCN的widgets,一个叫StatPress,一个是StatPress TopPosts。StatPress是主程序,显示访问统计的汇总信息,使用方法是把这个小工具在主题设计中加入侧栏即可,然后需要稍微做些编辑,相关参数通过形如%totoalvisitors%的形式调用,另外,还提供了显示最近来访者信息的功能(比如从哪儿来、访问了哪些文章等),可以在后台选项面板中启用。

2、那个TopPosts是显示热帖的,可以在主题设计中直接调用这个小工具。

3选项中可以直接设定文章热度显示和相关文章显示,不用修改主题代码(很方便哦);另外,为了方便朋友们定制使用统计参数,me提供了几个单独输出的函数,可以在模板代码中使用:

(1)/* Hot,当前页面的热度 */
function iri_StatPress_HotDepth()

注意事项:如果您在single中调用,直接使用 iri_StatPress_HotDepth() 就行了;如果您在index或archive中调用,请使用 iri_StatPress_HotDepth($post->ID) 以传入参数,否则显示的将是当前页面的浏览数而不是具体文章的浏览数。

(2)/* 获取相关文章*
function heart5_related_post($post->ID)

4、为了方便大家了解访客来源,提供了五个IP信息查询引擎,可以自由选用,默认的那个是带GMap支持的;

5、提供了用户自定添加恶意IP和爬虫列表自定义功能,高级用户专用,可以在选项中选择以出现编辑界面,默认是不开启的。

升级和纠错计划

  1. 修正通过google.com搜索但自动跳转至google.cn后无法有效识别中文搜索关键词的问题;【搞定
  2. 来自search.live.com的关键词貌似都很无关;【搞定
  3. 过滤形如/wp-cron.php的访问;【搞定
  4. 妥善处置来自baidu cache和google cache的页面参考;【Google Cache部分搞定Baidu Cache因为机制问题,暂无法处理
  5. 修正对blog源rss的访问统计,正确识别来自同一地址的抓取,目前的数据明显不合理,偏高;【搞定
  6. 增加对繁体中文关键词的判断和识别,方便台湾的朋友使用;【搞定
  7. 调整Overview默认显示天数为20;【搞定
  8. 解决形如akst_action=share-this页面的问题(因为me装了share-this插件导致的)【搞定】;
  9. 升级文章热度功能,图形化显示【搞定】;
  10. 丰富蜘蛛和爬虫数据文件;【持续更新ing
  11. 增加相关文章功能【搞定】;
  12. 把文章热度、最热文章、相关文章和随机文章自动化(不用在手动更改主题模板代码)【搞定了热度功能的自动化】;
  13. 优化statpress数据库结构,增加对访问文章的ID登记,彻底解决固定链接切换导致统计不准的问题(为爱折腾的朋友们提供)【搞定】;
  14. 增加用户定制功能,比如增加屏蔽IP和搜索引擎数据;【搞定
  15. 解决添加banip规则后依然记录该ip访问的问题【搞定】;
  16. 在侧栏小工具中显示当前访问者信息【搞定】;
  17. 增加对恶意访问IP的自动识别和禁止功能,安全防护;
  18. 提高来访者地理位置的识别精确度【搞定】;
  19. 对数据库中表大小限制提供相应处理机制。

升级记录:

—————————————

1.6.7.3 2009年1月3日

主程序:

  1. 修正了更改永久链接时在Opera浏览器下出现header错误的bug;
  2. 更改了当前访问在页面显示时的地理信息显示来源,更精确了;
  3. 添加移动用户来访分析子页面;
  4. 热度显示用小图标实现,增加美观度。

—————————————

1.6.6.7 2009年1月3日

主程序:

  1. 设置不同的ip信息服务器查询服务,采用调用外部免费接口的方式实现,放弃了自架服务器的设想和尝试;
  2. 在侧栏工具中增加comefrom参数,显示用户来自何方。

—————————————

1.6.6.6 2009年1月1日

主程序:

  1. 今天收到蓝十一的信,说是dh来信了,呵呵,看来这个ip查询的流量不小;换了四个小时时间还是没有找到更合适的免费ip查询服务,还是用hostinfo吧,比没有强;
  2. 在纵览中把ip统统加上链接,可以用domaintools进行查询,呵呵,那个内容可丰富的很;
  3. 增加了两行调试信息;
  4. 嗯,为元旦献礼了

—————————————

1.6.6.4 2008年12月31日

主程序:

  1. 为了方便调试,分离debug info页面出来作为独立的子页面出现,在其中增加了mysql版本信息、博客名称、blogsite(可能异于默认值)、编码、rss输出所用语言、固定链接模板,格式化输出php的加载模块;
  2. 修正了使用个性化地址做blog地址时无法识别文章链接的错误,感谢Maxim朋友(好像是俄罗斯的);
  3. 强化相关博文功能设置,如果访问量不超过1000,该项功能在选项中无法启用,以此来增强其准确度,因为内部逻辑是访问的次数越多,统计数据越趋于准确;
  4. 修正了相关博文功能无效输出的错误,在没有相关文章的情况下仍然输出“相关博文”几个字是不对的,现在好了,没有的话就不显示,静悄悄的多好;
  5. 根据doggie朋友的建议,在StatPress侧栏小工具中增加了所有页面访问量的参数供调用。

—————————————

1.6.6.0 2008年12月29日

主程序:

  1. 模块化相关文章功能(其实仅仅是来访者也访问了的文章),可以在选项中启用;启用后自动在前台文章的尾部显示“相关文章”功能。
  2. 升级程序时出现了一个问题,默认是开启文章热度和相关文章功能的,且取消不了,现已经修正了,但影响了部分朋友的使用,惭愧啊,教训

—————————————

1.6.5.4 2008年12月21日

主程序:

  1. 感谢hugo的建议,使用maxmind更精确的ip信息库,拿me的网站做的数据服务器,呵呵,希望访问量不要太大;
  2. 接受金融旅行者朋友的建议,对侧栏的统计输出格式进行调整,适合大部分模板主题;
  3. 感谢浮黑朋友的反馈,修正了对某类permalink设定的支持,比如/post/%year%%month%%day%/%post_id%.html;
  4. 修正对以commen结尾的链接请求的识别。

更新禁止IP、spider数据规则。

—————————————

1.6.4.1 2008年12月14日

主程序:

  1. 彻底模块化统计系统更新函数,大家可以自行决定对哪些数据记录进行更新,提升运行效率,对于访问量大的blog尤其实用;
  2. 在选项中选中某项功能直接执行该操作,不再延后;
  3. 在侧栏小工具中显示版本,方便问题追踪;

调整操作系统数据规则,可以识别摩托罗拉、诺基亚等手机上网。

—————————————

1.6.3.3 2008年12月10日

主程序:

  1. 优化了统计系统更新功能,减少对数据库的写操作,提升运行速度;
  2. 正式把意大利语言支持加入插件代码库;
  3. 修正了preg_match中因为php版本兼容问题出现的运行错误,另外在选项中提供了Debug Info信息输出功能,方便捉虫;
  4. 回复了statpress reloaded作者要求组团的要求,me更愿意独立开发;
  5. 更新了screenshot图片,有空在丰富说明帮助文档。

searchengine.dat增加了对icq的支持,其实它也是基于Google的;另外spider.dat和banip.dat都添加了新规则各一条。

—————————————

1.6.2.9 2008年12月7日

主程序:

  1. 感谢Gianni Diurno朋友(来自:gidibao.net)的支持,现在StatPressCN已经支持意大利语了;
  2. 修正了export输出时一楼ptype和pvalue字段的小错误,谢谢崔凯

spider.dat新增两个爬虫判定规则。

—————————————

1.6.2.6 2008年12月2日

主程序:

  1. 增加对spider数据的用户自定义功能;并且把它和对恶意IP自定义处理的选项设置,默认是不现实在功能菜单上的,可以在选项中使能;
  2. 接受崔凯朋友的建议,在详情页面中Top Referrer部分增加链接,方便回访;
  3. 为提升程序效率,更新了数据库字段数据类型,但过程中出了一次代码错误,导致用户页面出现出错提示,并遗漏了对非页面内容的访问数据,惭愧。

searchengine.dat和banip.dat以及spider都有更新。

—————————————

1.6.1.1 2008年11月26日

主程序:

  1. 经Hugo提醒,增加了对banips.dat的读写权限判断,原来也有服务器不允许php脚本写入用户目录的文件啊;
  2. 借鉴小雨天晴(pcload?)和崔凯同学的建议,丰富了ip查询工具,现在可以自由选择了,共四款,后两种中文用户专用。

searchengine.dat增加了两个俄罗斯的搜索引擎规则,谢谢Maxim朋友。

—————————————

1.6.0.0 2008年11月26日

主程序:

  1. 将关于StatPressCN的使用统计等功能拆分出去,在主题中使用,不拖累主程序;
  2. 完成恶意IP访问的用户自定义禁止功能,支持.htaccess文件限制访问规则自动生成;更新了bansip.dat的数据结构,支持不统计访问和禁止访问网站(很严厉哟,对恶意的黑客类访问可用)两种规则。

—————————————

1.5.7.9 2008年11月24日

主程序:

  1. 根据朋友的建议,在详情页面中增加了链接可以直接查询来访ip信息;
  2. 升级了支持页面,提供StatPressCN的全面信息(如下载数量以及部分使用了StatPressCN的blog的清单)。

蜘蛛数据:增加对sogou test的识别。

—————————————

1.5.6.9 2008年11月17日

主程序:

  1. 支持在侧栏小工具中显示当前访问者信息,并且自动化设置,可以在选项中使能。

—————————————

1.5.4.0 2008年11月16日

主程序:

  1. 完成相关文章功能的支持,访问量越大准确度越高!

—————————————

1.5.3.0 2008年11月16日

主程序:

  1. 接受wx朋友的建议,对侧栏widget稍微做了下美化,可惜me的css水平确实太菜,慢慢来吧;
  2. 在侧栏中增加对“技术支持来自天高云淡”字样,朋友们不会觉得很突兀吧,呵呵;
  3. 完善对采用默认永固链接的统计输出。

banip数据:增加对66.90.73.188的识别,还是freebsd系统,作为spider,为啥都不表明身份呢?!

—————————————

1.5.2.0 2008年11月15日

主程序:

  1. 增加了对page(页面)的访问统计支持;
  2. 重新规划Option(选项)页面,使之更直观;
  3. 解决了统计系统更新时丢失对feed和trackback记录的错误。

—————————————

1.5.1.8 2008年11月13日

主程序:

  1. 修正了无法识别禁访IP的bug。

—————————————

1.5.1.0 2008年11月13日

主程序:

  1. 识别对页面的feed和trackback的识别并统计访问次数。

搜索引擎数据:增加对114搜索的支持。

—————————————

1.5.0.0 2008年11月12日

主程序:

  1. 全面应用正则表达式工具,精确识别访问页面的postid,避免误判;提升页面显示效率;增加对分类和首页翻页的支持,比如那些page/2之类的链接请求。

banip数据:增加88.191.94.206、60.213.186.250、88.191.79.43、88.191.94.206、88.191.97.89。

—————————————

1.3.5.0 2008年10月27日

主程序:

  1. 费了好大功夫才揪出微软的Windows Live的作弊行为,彻底清除来自微软的无效搜索数据。

banip数据:增加对微软垃圾搜索IP的识别:65.55.109.和65.55.110.

—————————————

1.3.4.0 2008年10月26日

主程序:

  1. 在选项中添加显示文章热度功能,不用再手动更改主题文件了,哈哈。

—————————————

1.3.3.7 2008年10月26日

主程序:

  1. 增加对搜索引擎wordpress.org.cn和guogou.com的支持。

SearchEngine数据:

支持wordpress.org.cn和guogou.com。

—————————————

1.3.3.6 2008年10月25日

主程序:

  1. 解决了php5.0中有strripos函数而低版本无此函数无法运行StatPressCN的问题,兼容php4.×版本。
  2. 修正了链接请求尾部出现‘的问题(会破坏mysql查询语句)。

—————————————

1.3.3.0 2008年10月24日

主程序:

  1. 修正了统计界面中半个汉字的错误显示;
  2. 修改了“详情”中显示的项目数量。

SearchEngine数据:

增加了对Google Wap和Google Translate的识别,调整了规则顺序,提高程序运作效率。

—————————————

1.3.1.0 2008年10月15日

主程序:

  1. 升级了热帖功能,可以在index和archive中调用。这个功能很直观很方便,是属于访客界面友好类型的。
  2. 升级了对Google搜索引擎的识别,可以辨别client=pub-××××的搜索来访了。

Spider数据:

增加了2个新规则,修正了空格问题(会影响对spider的判别)

Browser数据:

增加了对OffByOne等浏览器的识别。

—————————————

1.3.0.0 2008年10月13日

主程序:

  1. 终于下定决心更改了统计数据库数据结构,对访问页面的id进行登记,这下可以完美解决用户更改permalink设定带来的统计不准问题;爱折腾的同学们,随便换permalink吧,记得在StatPressCN管理界面中对统计系统升级就行了;
  2. 尽量使用wordpress内置函数,少用数据查询,提高程序运行效率。

—————————————

1.2.3.0 2008年10月12日

主程序:

  1. 匆忙间居然把对操作系统和浏览等要素的识别代码给删除了,修正之;
  2. 解决了对形如/category/life/page/3的识别。这个是分类中文章分多页产生的链接形式。
  3. 摒弃原统计中对在线rss阅读器的识别。只要是spider,全杀之。部分解决了上次Hugo Chen朋友提出了统计数据偏高问题。核心就是对spider的处理机制问题。
  4. 在readme.txt文件中增加了用法说明。

Spider数据:

增加了1个新规则

—————————————

1.1.2.5 2008年10月11日

主程序:

  1. 大幅度调整代码,增加对默认固定链接结构的设定支持和兼容,也就是说不管您的固定链接如何设定,StatPressCN都可以很好的工作了;
  2. 增加了对标签、归档、日历等的有效识别;
  3. 更新说明文件,因为使用了部分函数,需要WordPress最低2.3版本及以上的支持;
  4. 经Hugo Chen朋友提醒,增加zh_TW本地化语言文件;
  5. 更新了说明文档中的示例图片。

Spider数据:

增加了12个新规则

—————————————

1.1.1.0 2008年10月7日

主程序:

  1. 修正热帖功能,图形化显示(红五角星);
  2. 丰富说明文件;
  3. 完善简体中文和繁体中文的本地化语言文件。

—————————————

1.0.4.0 2008年10月4日

主程序:

  1. 增加了对简体中文和繁体中文的本地化语言支持。

—————————————

1.0.3.1

主程序:

  1. 为入驻wordpress官方插件基地对程序和文档进行了规范;
  2. 修正程序注释。

SearchEngines数据:

增加了对yahoo alibaba搜索的支持。
—————————————

1.0.3.0

主程序:

  1. 修正了来自www.google.cn的图片搜索;精确识别来自Google搜索联盟(client=aff-sub-lianmeng)的关键字;
  2. 修正搜索引擎名称机制,根据关键字字符码来判断搜索引擎的细类(如Google hk、Google cn和Google tw等);
  3. 对upgrade代码进行了优化。

SearchEngines数据:

增加了对Maxthon搜索的识别。
—————————————

1.0.2.5

主程序:

  1. 完善对繁体中文的支持;
  2. 彻底解决对连接请求的处置。

SearchEngines数据:

增加了繁体中文使用地区Google Cache的支持。

—————————————

1.0.2.0

主程序:

  1. 再次优化搜索引擎关键词的识别,通过搜索引擎类型和其命令开关判断是否需要转换内码;开始支持繁体中文;
  2. 从服务器变量获取连接请求时暂不作解码处理,对默认链接(形如p=233等)链接请求直接处置为permalink;源码中对链接请求的处理考虑了SEO,结果复杂化了,并且导致异形链接请求无法被正确处理,已修正之。
Spider数据:
增加对R6_CommentReader的识别;

SearchEngines数据:

增加了对Google hk、Google tw、Yahoo tw、Yahoo hk搜索引擎的识别,修正了对yahoo搜索合作伙伴的支持(形如coop.yahoo.com.cn)。
—————————————

1.0.1.0

主程序:

  1. 重构了对搜索引擎的识别和处理,优化程序运行效率(解决了upgrade时超时的问题),新增对Google Images和Google Cache的识别,同时对Google cn的处理做了修正,能正确辨别哪些需要decode,哪些不需要;
  2. 解决了因为搜索引擎对加载share-this插件后默认是p=222格式的不正确处理(urlrequested变成了share-this)。
Spider数据:
增加对Yahoo slurp的识别;

SearchEngines数据:

增加了对Google Images、Google Cache和Google cn搜索引擎的识别和修正。

—————————————

1.0.0.3

主程序:

  1. 假如定义了数据保存的时限(在Options中),点按StatPressUpgrade可以自动对保存期限之外的数据进行删除,同时显示删除了多少条记录;
  2. 修正对形如p=23&akst_action页面的识别问题。(p=23样子的页面访问记录主要出现原因是wordpress默认链接导致的,很普遍)
Spider数据:
无;
Broswer数据:
无。
SearchEngines数据:
增加了对Conduit.com、google.com/custom、yahoo.cn搜索引擎的识别,对关键词顺序进行了调整,提高判断效率;删除了大部分用不到的搜索引擎数据,提升程序效能。

—————————————

1.0.0.2

主程序:

  1. 增加两个函数输出,方便朋友们定制模板使用;
  2. 把订阅活跃周期从原来的1一个月修改为半年。
Spider数据:
无;
Broswer数据:
无。
—————————————

1.0.0.1

主程序:

  1. 增加对blog源rss地址访问的统计;
  2. 修正OverView页面:Last Hits仅显示对文章、存档、主页等实质内容的访问记录,不显示rss类的访问记录;
  3. 修正Details页面:Last Referrer仅显示来自其他网站的引用,去除来自搜索引擎的页面引用;
  4. 支持中文搜索引擎,能正确识别搜索关键词;
  5. 如果永久链接结构中有用到postname则可以通过upgrade把原来形如p=21之类的方位地址自动转换为目前的链接样式。
Spider数据:
增加对Blogbus、Sogou、Friendfeed的识别;
Broswer数据:
增加对Chrome浏览器的支持。