PHP判断字符串中是否含有中文

自从有了黑帽SEO,对付SPAM(垃圾留言)一直是网站工作人员的工作内容之一。迫害我们的不是垃圾留言群发机,就是垃圾用户注册机。

判断字符串中是否含有中文是对付SPAM的方法之一,可以有效的阻止纯英文的垃圾留言,还可以用这个方法规范用户注册。看下面的代码,兼容gb2312和utf-8。

<?
$str = "测试中文";
echo $str;
echo "<hr>";
//if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) { //只能在GB2312情况下使用
//if (preg_match("/^[\x7f-\xff]+$/", $str)) { //兼容gb2312,utf-8  //判断字符串是否全是中文
if (preg_match("/[\x7f-\xff]/", $str)) {  //判断字符串中是否有中文
echo "正确输入";
} else {
echo "错误输入";
}
?>

另附,双字节字符编码范围

1. GBK (GB2312/GB18030)
\x00-\xff GBK双字节编码范围
\x20-\x7f ASCII
\xa1-\xff 中文 gb2312
\x80-\xff 中文 gbk

2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韩文
\xAC00-\xD7A3 (韩文)
\u0800-\u4e00 (日文)*/

window.parent与window.opener的区别与使用

1、window.parent 是iframe页面调用父页面对象

举例: a.html

<html>
<head><title>A</title></head>
<body>
<form name=”form1″ id=”form1″>
<input type=”text” name=”username” id=”username”/>
</form>
<iframe src=”b.html” width=100%></iframe>
</body>
</html>

如果我们需要在b.html中要对a.html中的username文本框赋值(就如很多上传功能,上传功能页在ifrmae中,上传成功后把上传后的路径放入父页面的文本框中),我们应该在b.html中写:

<script type=”text/javascript”>
var _parentWin = window.parent;
_parentWin.form1.username.value = “xxxx”;
</script>

继续阅读

使用 canonical 标签解决 HDWiki 内容重复问题

不得不说HDWiki是一个问题相当多的程序,论坛人气差,反映的问题往往不能得到很好的解决。

以自己的 淮南百科 为例,在开启伪静态的情况下,同一个词条的链接可能有以下几种:

  1. http://baike.i0554.com/doc-view-273.html
  2. http://baike.i0554.com/doc-innerlink-淮王鱼.html
  3. http://baike.i0554.com/doc-innerlink-肥王鱼.html
  4. baike.i0554.com/?doc-innerlink-淮王鱼
  5. http://baike.i0554.com/doc-view-273

简单分析一下这几个链接:第一个链接是正确的,大多数地方出现的链接都是这个;第二个链接是在相关词条中出现的;第三个链接是在同义词中出现的,链接的形式和第二个一样;第四个链接同前两个类似,是在搜索引擎中用site命令发现的;第五个链接也是在搜索引擎中用site命令发现的。

链接不同而内容相同,这对搜索引擎来说是比较忌讳的,甚至可能会被认为成作弊。个人认为这也是Google等搜索引擎对HDWiki程序的网站不友好的原因之一。

有问题当然要解决问题,下面是我的解决办法:

在模版header.html中添加标签<link rel=”canonical”>

<!–{if $doc[‘did’]}–><link rel=”canonical” href=”{$setting[‘site_url’]}/{url doc-view-$doc[‘did’]}” /><!–{/if}–>

具体效果如何,暂时还不知道,过段时间再观察网站在搜索引擎的表现。

WordPress 后台升级时提示输入 FTP 信息

WordPress 的在线安装和升级实在方便,不过这功能有时候也不那么好用,在不同的服务器主机环境下就可能会有不同的效果。今天就在VPS下关于这个功能遇到点麻烦,当添加、删除、升级 WordPress 插件主题或者直接升级 WordPress 的时候,提示需要输入FTP账户信息,而且输入了FTP账户信息也不管用(无法连接服务器,不知道我哪里设施的不对)。

寻寻觅觅,找到三个方法,没错,是三个方法。

一、在 wp-config.php 里加入下面代码

define(“FS_METHOD”, “direct”);
define(“FS_CHMOD_DIR”, 0777);
define(“FS_CHMOD_FILE”, 0777);

我就是用这个方法解决了问题。

二、在 wp-config.php 里加入下面代码

define(‘FTP_HOST’, ‘ftp.yoursite.com’);
define(‘FTP_USER’, ‘Your_FTP_Username’);
define(‘FTP_PASS’, ‘Your_FTP_password’);
//如果你的 FTP 可以使用 SSL 连接,把下面设置为 True
define(‘FTP_SSL’, true);

省去重复登陆的麻烦 继续阅读

将 UCenter 事件导入 Discuz! X1.5 家园

最初做站便是从 Discuz! 开始,还记得当年用的版本是6.0,论坛关闭以后便没再继续使用。两年多过去了,现在的版本已经发展到了Discuz! X1.5。可以说 Discuz! X1.5 将 UCHome 和 Discuz! 论坛很好的整合在了一起。

UCenter 对于站长来说是个很好的平台和工具,利用 UCenter 可以将很多程序的会员系统整合在一起,不仅仅是会员系统,还包括用户事件(feed)、短消息等。

一直使用 UCenter 整合使用 hdwiki、phpcms 等程序,最近开始测试 Discuz! X1.5。一段时间后发现 UCenter 后台中的用户事件积累了很长的列表,没有通知到 Discuz! X 的家园。到dz论坛去找答案,发现很多人有我同样的问题,不过都没有很好的办法解决,无奈之下,只好自己动手。

从论坛中得知 UCHome 可以显示 UCenter 中其他应用的事件,研究了相关代码后发现,UCHome 通过程序的计划任务定时获取 UCenter 中的事件并导入到 UCHome 数据库,某个目录下 cron/getfeed.php 的脚本,而 Discuz! X 的计划任务中则没有这一项。

那么我们只需要改造一下这个脚本,让它在 Discuz! X 下工作就可以了,还是不废话了,直接贴出源码: 继续阅读

PHP 自定义函数实现 JavaScript escape 编码

中文字符在JSON中是无法处理的,使用的后果一定是乱码伺候,通常我们用JavaScript的escape函数对中文进行编码转换,比如cookie中的用户名。

有些情况下,为了保持程序的一致性,我们需要在PHP中对中文字符进行escape编码,而PHP本身是没有escape函数的,于是便诞生了一些PHP中的自定义函数实现escape编码。

function phpescape($str){
$sublen=strlen($str);
$reString="";
for ($i=0;$i<$sublen;$i++){
if(ord($str[$i])>=127){
$tmpString=bin2hex(iconv("GBK","ucs-2",substr($str,$i,2)));    //此处GBK为目标代码的编码格式,请实际情况修改
if (!eregi("WIN",PHP_OS)){
$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);
}
$reString.="%u".$tmpString;
$i++;
} else {
$reString.="%".dechex(ord($str[$i]));
}
}
return $reString;
}

继续阅读

使用 getFullYear 获取当前年份

今天 @Washun 跟我找一段可以显示当前日期的js代码,于是从网上搜来一段简单的代码,在Chrome等浏览器下显示的年份却是110,这个问题之前也有在其他地方遇到过,一直没有引起重视。

于是继续Google,getYear 和 getFullYear 均是 JavaScript 中 Date 对象的方法。

可是有些浏览器,如 Firefox、Chrome,getYear 始终返回 Date 对象中的年份是与 1900 年之间的差距,也就是说如果 Date 对象表示的是今年(2010年),那么返回的就是 110。

即使在 IE 中,如果 Date 对象中的年份是在1900-1999这段时间内,返回的仍然是 Date 对象中的年份与1900年之间的差距。

而 getFullYear 就不存在这个问题, getYear() 方法确实已经过时,我们还是改用 getFullYear 吧。

这里是一个返回当前日期时间的JavaScript函数,

<script type="text/javascript">
function GetDateT(){
var d,s;
d = new Date();
s = d.getFullYear() + "-";             //取年份
s = s + (d.getMonth() + 1) + "-";//取月份
s += d.getDate() + " ";         //取日期,用\n表示换行
s += d.getHours() + ":";       //取小时
s += d.getMinutes() + ":";    //取分
s += d.getSeconds();         //取秒
return(s);
}
myDate=GetDateT()
document.write(myDate)
</script>

返回的结果为:2010-12-2 14:53:4

CopyToFriends 1.1 for Z-Blog1.8 复制文章标题和链接

首先要说明的是,这是一个Z-Blog插件,作为一个很久没发布插件的人,我感觉压力很大。不过Z-Blog确实已经很久没有大动静了,曝光一下,传说中的 Z-Blog 1.9 连内测都还没开始。

CopyToFriends插件介绍

启用该插件后,将在文章底部加入复制文章链接的按钮,复制文章标题和链接到剪切板,复制下来的内容你干什么都行。当然,我的意思是分享给好友。

新版使用了ZeroClipboard类库,经过测试,完美支持IE、Firefox、Chrome、Opera等浏览器。

插件下载

下载插件 下载插件(菠萝的海)

很简单的插件,到此也就算发布完毕了。不想这么短短几行文字就结束了,下面说说ZeroClipboard的应用。

ZeroClipboard的应用

为了在各浏览器下都能够正常工作,之前这个插件使用的是 Clipboard Copy 解决方案,利用一个隐藏的 Flash 实现复制。但最新的 Flash Player 10 只允许在 Flash 上进行操作才能启动剪贴板。于是新的解决方案又出来了,就是这里用到的 ZeroClipboard。ZeroClipboard用了一个透明的 Flash ,让其漂浮在按钮之上,这样其实点击的不是按钮而是 Flash。如果你使用 Firefox 并且安装了adblock扩展,鼠标悬停在按钮上的时候会发现有 Flash 的提示 。

ZeroClipboard提供了一些函数,很有应用价值,但这里不一一赘述。建议有兴趣的朋友去参考官网上的说明和教程,网上搜来的教程很没用。 继续阅读

闹了一个 WordPress 置顶文章的笑话

WordPress的文章置顶功能设计的不是很明显,只在文章的快速编辑中才有。

刚开始用的时候,这让我以为WordPress没有文章置顶的功能。由于有需要,便开始寻觅插件解决这个问题,很容易找到一款WP-Sticky

成功安装WP-Sticky并解决问题后,便发现上面说到的快速编辑中的文章置顶功能。原来早期的WP需要插件来实现置顶,但是现在WP在2.7以后便原生支持了。我的原则是尽可能少的使用插件(无论是Z-Blog还是WordPress),于是便禁用了插件。

然后杯具发生了,发现置顶文章的标题前一直显示着“Announcement:”作为前缀,非常郁闷,便一口咬定这是主题语言包没有翻译造成的。更可怜的是,找遍了整个WordPress文件夹,除了两个授权文件(txt格式),连announcement字样都没发现,更别提语言包了。

开始寻思着重新启用WP-Sticky,不用WP自带的置顶功能。启用了WP-Sticky,并将一篇文章设置为sticky。转到快速编辑中取消原来设置的置顶,这才发现文章标题的前面被加入了“Sticky:”,在“Announcement:”前面。

原来WP-Sticky插件在设置了文章置顶后会在文章标题前加入announcement和sticky……一个不熟悉WordPress的人闹出的笑话,多绕了一个圈,又回到原点。

PS:WP-Sticky在文章编辑页面增加三个选项,分别为announcement,sticky,normal。

解决 PHPCMS2008 RSS 不更新的BUG

PHPCMS一直是我最喜欢的CMS,模块和模型的概念非常好。近日发现自己一个PHPCMS做的网站,RSS一直停留在2009年……PHPCMS使用了Flaimo.com RSS Builder的RSS类,虽然是一个很老的东西,达到目的最重要。

1.rss.php继续查找,39行

$sql .= " ORDER BY `catid` DESC LIMIT 0 , 20";

修改为

$sql .= " ORDER BY `contentid` DESC LIMIT 0 , 20";

2.还是rss.php文件查找,90行

$sql = "SELECT `title`, `description`, `url`, `inputtime`, `thumb`, `keywords` FROM ".DB_PRE."content WHERE `status` = ’99’ ORDER BY `catid` DESC LIMIT 0 , 20";

修改为

$sql = "SELECT `title`, `description`, `url`, `inputtime`, `thumb`, `keywords` FROM ".DB_PRE."content WHERE `status` = ’99’ ORDER BY `contentid` DESC LIMIT 0 , 20";