[置顶]求在线手册,长期有效

求:PHP、JS、JQuery等在线手册

目的:方便大家查

基本要求:是一个手册

最好:1.内容全;2.带查询;3.更新方便;4.能评论

提供方式1:留言回复下载地址

提供方式2:将手册打包发送至邮箱cgfeel@gmail.com

本信息长期有效,感谢大家提供!


让PHP更快的提供文件下载

一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.

但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载.

  1. <?php
  2.     $file = “/tmp/dummy.tar.gz”;
  3.     header(“Content-type: application/octet-stream”);
  4.     header(‘Content-Disposition: attachment; filename=”‘ . basename($file) . ‘”‘);
  5.     header(“Content-Length: “. filesize($file));
  6.     readfile($file);

但是这个有一个问题, 就是如果文件是中文名的话, 有的用户可能下载后的文件名是乱码.

于是, 我们做一下修改(参考: : Read more »


高质量的免费 PSD 界面设计素材

这个系列的文章收集了100套新鲜出炉的精美免费分享给大家,您可以免费下载使用。这些高质量的网站 PSD 素材可以让您的工作得心应手,帮助您节省大量的时间和精力。感谢那些优秀的设计师分享他们的劳动成果,让更多的人可以使用他们的创意设计,希望这些免费的 PSD 素材能帮助到您。

 

Circular Power Buttons

Read more »


展现你的毛笔书法风采-The Shodo

没错!您今天看到的又是一个充满中国元素但又不是中国人创造出来的趣站。网站一水的英文,偶尔冒出“書道”、”笔”、”墨”之类的几个汉字。是的,这是一个可以在线练习毛笔书法的Html5应用站。在这里,你可以练习一下久违的毛笔字,同时也可以与网友们一起分享。在泼墨书文的同时,我们不禁感叹,“書道”的背后是我们明知却不肯挽回的遗失,“書道”的背后是我们曾经的骄傲和现时难以找回的根本。

展现你的毛笔书法风采-The Shodo

传送门 http://www.theshodo.com/

方法 Read more »


HTML5游戏合集-海盗爱菊花

网上找到的名字,很贴切,所以就用上了。。。基于HTML5技术开发的TD小游戏,它的背景音乐和音效都很不错,玩法上倒没什么创新,喜欢的朋友可以试试。。。

HTML5游戏合集-海盗爱菊花

传送门 http://www.pirateslovedaisies.com/

玩法 Read more »


Html5经典在线应用-云动画软件Mugeda

目前,网络上被称之为动画的东西无非有两种,GIF和Flash,应用极其广泛。把魔爪正伸向各种类型软件的Html5也没有放过这块大五花肉。。。

今天的这个网站就是由Html5标准开发完成的,无需安装,直接访问直接用,UI是仿flash的,操作起来很方便。当然,所有的东西看起来都那么简单,其实,复杂过程是在我们创作当中。。。也许99%的网友对它不屑,但我相信他们会被那1%的作品所打动。。。

Html5经典在线应用(一)-云动画软件Mugeda

传送门 https://www.mugeda.com/

方法

为了方便我们保存动画作品,进入网站首先点击右上角register注册。登陆后,点击菜单栏上的Create Content创建动画,接下来就是创作了,此处省略一万字。。。

完成后保存即可,无需要导出,点击菜单栏Browse下的My Works 即可观看你的作品,点击作品可以观看和编辑详细的设置,比如是否分享、公开和生成嵌套代码等。。。


html5 sqlite操作类

一个html5 sqlite操作类,支持链式操作,之前一个项目上用过,感觉还不错,有问题请大家指教

//copyright by lanxyou  lanxyou[at]gmail.com
var lanxDB=function(dbname){
	var db=openDatabase(dbname,'1.0.0','',65536);
	return{
		//返回数据库名
		getDBName:function(){
			return dbname;
		},
		//初始化数据库,如果需要则创建表
		init:function(tableName,colums){
			this.switchTable(tableName);
			colums.length>0?this.createTable(colums):'';
			return this;
		},
		//创建表,colums:[name:字段名,type:字段类型]
		createTable:function(colums){
			var sql="CREATE TABLE IF NOT EXISTS " + this._table ;
			var t;
			if (colums instanceof Array && colums.length>0){
				t=[];
				for (var i in colums){
					t.push(colums[i].name+' '+colums[i].type);
				}
				t=t.join(', ');
			}else if(typeof colums=="object"){
				t+=colums.name+' '+colums.type;
			}
			sql=sql+" ("+t+")";
			var that=this;
			db.transaction(function (t) {
				t.executeSql(sql) ;
            })
		},
		//切换表
		switchTable:function(tableName){
			this._table=tableName;
			return this;
		},
		//插入数据并执行回调函数,支持批量插入
		//data为Array类型,每一组值均为Object类型,每一个Obejct的属性应为表的字段名,对应要保存的值
		insertData:function(data,callback){
			var that=this;
			var sql="INSERT INTO "+this._table;
			if (data instanceof Array && data.length>0){
				var cols=[],qs=[];
				for (var i in data[0]){
					cols.push(i);
					qs.push('?');
				}
				sql+=" ("+cols.join(',')+") Values ("+qs.join(',')+")";
			}else{
				return false;
			}
			var p=[],
				d=data,
				pLenth=0,
				r=[];
			for (var i=0,dLength=d.length;i<dLength;i++){
				var k=[];
				for (var j in d[i]){
					k.push(d[i][j]);
				}
				p.push(k);
			}
			var queue=function(b,result){
				if (result){
					r.push(result.insertId ||result.rowsAffected);
				}
				if (p.length>0){
					db.transaction(function (t) {
						t.executeSql(sql,p.shift(),queue,that.onfail);
					})
				}else{
					if (callback){
						callback.call(this,r);
					}
				}
			}
			queue();
		},
		_where:'',
		//where语句,支持自写和以对象属性值对的形式
		where:function(where){
			if (typeof where==='object'){
				var j=this.toArray(where);
				this._where=j.join(' and ');
			}else if (typeof where==='string'){
				this._where=where;
			}
			return this;
		},
		//更新数据,data为属性值对形式
		updateData:function(data,callback){
			var that=this;
			var sql="Update "+this._table;
			data=this.toArray(data).join(',');
			sql+=" Set "+data+" where "+this._where;
			this.doQuery(sql,callback);
		},
		//根据条件保存数据,如果存在则更新,不存在则插入数据
		saveData:function(data,callback){
			var sql="Select * from "+this._table+" where "+this._where;
			var that=this;
			this.doQuery(sql,function(r){
				if (r.length>0){
					that.updateData(data,callback);
				}else{
					that.insertData([data],callback);
				}
			});
		},
		//获取数据
		getData:function(callback){
			var that=this;
			var sql="Select * from "+that._table;
			that._where.length>0?sql+=" where "+that._where:"";
			that.doQuery(sql,callback);
		},
		//查询,内部方法
		doQuery:function(sql,callback){
			var that=this;
			var a=[];
			var bb=function(b,result){
				if (result.rows.length){
					for (var i=0;i<result.rows.length;i++){
						a.push(result.rows.item(i));
					}
				}else{
					a.push(result.rowsAffected);
				}
				if (callback){
					callback.call(that,a);
				}
			}
			db.transaction(function (t) {
				t.executeSql(sql,[],bb,that.onfail) ;
			})
		},
		//根据条件删除数据
		deleteData:function(callback){
			var that=this;
			var sql="delete from "+that._table;
			that._where.length>0?sql+=" where "+that._where:'';
			that.doQuery(sql,callback);
		},
		//删除表
		dropTable:function(){
			var sql="DROP TABLE IF EXISTS "+this._table;
			this.doQuery(sql);
		},
		_error:'',
		onfail:function(t,e){
			this._error=e.message;
			console.log('----sqlite:'+e.message);
		},
		toArray:function(obj){
			var t=[];
			obj=obj || {};
			if (obj){
				for (var i in obj){
					t.push(i+"='"+obj[i]+"'");
				}
			}
			return t;
		}
	}
}

/*
examples:
var db=new lanxDB('testDB');
db.init('channel_list',[{name:'id',type:'integer primary key autoincrement'},{name:'name',type:'text'},{name:'link',type:'text'},{name:'cover',type:'text'},{name:'updatetime',type:'integer'},{name:'orders',type:'integer'}]);
db.init('feed_list',[{name:'parentid',type:'integer'},{name:'feed',type:'text'}]);
db.switchTable('channel_list').insertData([{name:'aa',link:'ss',updatetime:new Date().getTime()},{name:'bb',link:'kk',updatetime:new Date().getTime()}]);
db.where({name:'aa'}).getData(function(result){
	console.log(result);//result为Array
});
db.where({name:'aa'}).deleteData(function(result){
	console.log(result[0]);//删除条数
});
db.where({name:'bb'}).saveData({link:'jj'},function(result){
	console.log(result);//影响条数
})
})
*/

PHP算法3则

PHP算法之冒泡排序

/**
 * 冒泡排序 (一维数组)
 * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止
 * 设想被排序的数组R[1..N] 垂直竖立,将每个数据元素看作有重量的气泡,从下往上扫描数组,凡扫描违反原则的轻气泡,就使其向上"漂浮".如此反复进行.
 * 直到最后任何两个气都是轻者在上,重者在下为止.
 */
function bubble_sort($array) {
        $count = count($array);
        if($count < 0) {
                return false;
        }
        for($i = 0; $i < $count; $i++) {
                for($j = $count - 1; $j > $i; $j--) {
                        if($array[$j] < $array[$j - 1]) {
                                $tmp = $array[$j];
                                $array[$j] = $array[$j - 1];
                                $array[$j - 1] = $tmp;
                        }
                }
        }
        return $array;
}

PHP算法之猴子选大王的游戏

Read more »


6 个超级实用的 WordPress 奇技淫巧

1、防止自动压缩图片

WordPress 默认会在上传 jpg 图片时自动压缩。这有利于节省贷款,减少加载时间。假如你是个摄影爱好者,热衷于在博客上展现摄影作品的话,高质量的图片就尤其重要了,将以下代码添加到 functions.php 文件,快速禁用图片自动压缩。

add_filter('jpeg_quality', function($arg){return 100;});

来自 http://www.wprecipes.com/prevent-wordpress-to-compress-your-jpg-images

2、为所有的链接添加 target=”_blank” 属性 Read more »


PHP 和浏览器缓存机制

浏览器的缓存策略,会暂时将浏览过的文件缓存在本地磁盘。当用户重复请求页面时,告知客户端页面并没有发生改变,可以调用缓存。 那么如何知道客户端是否有页面缓存呢?从 HTTP 协议层面来说,浏览器发送请求时会先发送如下 HTTP 头:

Connection	Keep-Alive
Date	Sun, 06 May 2012 18:00:36 GMT
Last-Modified	Sun, 06 May 2012 17:31:02 GMT
Etag	ec1f629013925ab0fa4389ba926e8c06
Keep-Alive	timeout=15, max=299
Server	Apache/2.2.16 (Unix) DAV/2
Vary	Accept-Encoding

请注意其中的这两行,描述了页面的缓存信息:

Last-Modified	Sun, 06 May 2012 17:31:02 GMT
Etag	ec1f629013925ab0fa4389ba926e8c06

这个情况下,如果服务器响应 304 状态码,浏览器会自觉地从缓存中读取数据;如果响应 200 状态码,不管有没有客户端缓存,照样从服务端读取。

按照这个理论支撑,比如站长军团大部分查询结果都是 ajax 异步获取的,二次访问就都可以通过这种方式进行缓存改造。只要客户端有缓存,就向客户端发送一个 304 响应状态码,然后退出程序执行。

浏览器发出的请求中包含 If-Modified-Since 和 If-None-Match 两个参数:

If-Modified-Since 表示询问数据的最后修改时间是否是某个时间值。然后服务器会检查数据的最后修改时间,如果是该时间则返回 304 状态码,客户端接收到该状态码后直接从本地读取缓存。这种情况有一个前置条件,即本地必须存在缓存资源,浏览器才会发送 If-Modified-Since 参数,并且值为上一次服务器返回的 Last-Modified 值。

If-None-Match 类似,它由服务器返回的 Etag 值生成,仅仅用于服务器检查数据的修改时间,可以是任意值。考虑到 If-Modified-Since 结合 Last-Modified 的方法并不被所有服务器支持,这里就只考虑使用 etag 的实现。

PHP 中通过 $_SERVER['HTTP_IF_NONE_MATCH'] 可以判断文件是否被浏览器缓存,代码片段如下:

//使用 etag 标记控制缓存
$etag = md5(date('Ymd'));
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
	header('Etag:' . $etag, true, 304);
	exit();
} else {
	header('Etag:' . $etag);
}

这里我使用当日日期来生成 etag,这样可以保证缓存最多生效一天时间,这个参数可以根据需要修改。

补充说明:
即便是 304 响应,实际上还是会请求服务端,因为需要建立连接来判断是否需要传输数据,304 缓存节约的是静态资源传输的开销;
另一种缓存是 200 响应时的缓存,当网络中断导致浏览器脱机时,如果客户端缓存存在,请求会响应 200 状态码,并从本地直接读取缓存。


首发Zend Studio 9.0.2正式版注册破解(2012-03-05更新)

写在前头
以下方法仅供技术交流学习,请勿非法使用,如长期使用请支持购买正版。
正版购买地址:http://shop.zend.com/en/zend-studio-for-eclipse.html
你还没有最新安装程序?
ZendStudio下载地址:http://www.geekso.com/component/zendstudio-downloads/
注册破解步骤 Read more »


如何为 PHP 贡献代码

PHP在之前把源代码迁移到了git下管理, 同时也在github(https://github.com/php/php-src)上做了镜像, 这样一来, 就方便了更多的开发者为PHP来贡献代码.

今天写这篇文章, 就是为了给在国内的同学们, 愿意为PHP开源社区做贡献的同学们, 做个示例, 如何为PHP来贡献你的智慧.

现在, 假设你要为贡献一个新特性, 或者简单点, 你要为PHP修复一个bug(一般来说, 大家可以在这里发现PHP已经报告的bug: 注册github Read more »


PHP6使用preg_split函数替换split

split
(PHP 4, PHP 5)

split — Split string into array by regular expression

array split ( string $pattern , string $string [, int $limit ] )

WarningThis function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged. Read more »


Gmail 附件自动保存到 Google Drive

我们刚刚介绍了通过Chrome扩展在Gmail附件后面加上一个保存到Google Drive链接的方法,不过为这么一个小破功能还占用一个扩展有些大炮打蚊子,另外如果我们不用Chrome咋办?有更聪明的技巧:

  1. 登录你的Google帐号,打开这个Google Docs表格,同时创建一个副本,保存在自己的Google Docs里。
  2. 在打开这个表格的时候你应该会看到一个新的Gmail菜单,点击Initialize初始化之,并获取权限。
  3. 再打开Gmail菜单里的Run,运行之,搞定!

这个Google Docs表格将每2分钟就扫描一下你的Gmail收件箱,只要找到被标记为GoogleDrive的邮件,就会自动保存邮件的所有附件到Google Drive里的Gmail文件夹里。

所以说,当你收到一封带附件的邮件,你觉得有必要将附件保存到Google Drive里的话,就将其打上GoogleDrive标签,之后就不用管了,邮件里的附件将自动转存到你Google Drive里那个叫Gmail的文件夹里。


用来解析 .htpasswd、.htgroup 文件的 PHP 类

.htpasswd 文件示例:

user1:{SHA}kGPaD671VNU0OU5lqLiN/h6Q6ac=
user2:{SHA}npMqPEX3kPQTo+x/+ZckHDrIcQI=
user3:{SHA}q1Fh2LTUjjkncp11m0M9WUH5Zrw=

[PHP]代码

class Htpasswd {

	private $file = '';
	private $salt = 'AynlJ2H.74VEfI^BZElc-Vb6G0ezE9a55-Wj';

	private function write($pairs = array()) {
		$str = '';
		foreach ($pairs as $username => $password) {
			$str .= "$username:{SHA}$password\n";
		}
		file_put_contents($this -> file, $str);
	}

	private function read() {
		$pairs = array();
		$fh = fopen($this -> file, 'r');
		while (!feof($fh)) {
			$pair_str = str_replace("\n", '', fgets($fh));
			$pair_array = explode(':{SHA}', $pair_str);
			if (count($pair_array) == 2) {
				$pairs[$pair_array[0]] = $pair_array[1];
			}
		}
		return $pairs;
	}

	private function getHash($clear_password = '') {
		if (!empty($clear_password)) {
			return base64_encode(sha1($clear_password, true));
		} else {
			return false;
		}
	}

	public function __construct($file) {
		if (file_exists($file)) {
			$this -> file = $file;
		} else {
			die($file." doesn't exist.");
			return false;
		}
	}

	public function addUser($username = '', $clear_password = '') {
		if (!empty($username) && !empty($clear_password)) {
			$all = $this -> read();
			if (!array_key_exists($username, $all)) {
				$all[$username] = $this -> getHash($clear_password);
				$this -> write($all);
			}
		} else {
			return false;
		}
	}

	public function deleteUser($username = '') {
		$all = $this -> read();
		if (array_key_exists($username, $all)) {
			unset($all[$username]);
			$this -> write($all);
		} else {
			return false;
		}
	}

	public function doesUserExist($username = '') {
		$all = $this -> read();
		if (array_key_exists($username, $all)) {
			return true;
		} else {
			return false;
		}
	}

	public function getClearPassword($username) {
		return strtolower(substr(sha1($username.$this -> salt), 4, 12));
	}

}

使用方法 Read more »


优化 MySQL 语句的十个建议

Jaslabs的Justin Silverton列出了十条有关优化MySQL查询的语句,我不得不对此发表言论,因为这个清单非常非常糟糕。另外一个Mike也同样意识到了。所以在这个博客中,我要做两件事情,第一,指出为什么这个清单很糟糕,第二,列出我的清单,希望我的比较好些。继续看吧,无畏的读者们!

(译者注:作者借这个题目反讽另一篇同名的文章)

为什么那个清单很糟糕

1.他的力气没使对地方 Read more »


focus – 获取文本框焦点

document.getElementById(“username”).focus();
此js在IE中可用,但在firefox中失效;
解决方法:
加定时器
window.setTimeout(function(){document.getElementById(“username”).focus();}, 0);

jquery是文本框获得焦点 Read more »


抱大腿应该记好的四句话

1、不要盘算太多,要顺其自然。该是你的终会得到。

2、压抑自己没必要,奉承巴结也没必要。保持应有的人格力量将赢得更多机会和尊重。

3、不要对谁特别好,也不要对谁特别不好。永远不要被少数人所利用。 Read more »


小TIPS:AI调整矩形圆角边角度

在画圆角的同时按住上下方向键


初识 jQuery Deferred

jQuery 1.5之前,Ajax请求可能有点麻烦。写一个简单get请求,你可能会写成:

$(function() {
  $.get(
    "content.txt",
    function(resp) {
      console.log("first code block");
      console.log(resp);
    }
  );

});

但这种写法存在一个问题:如果你不定义一个函数来运行此代码,执行失败后会发生什么?在这个问题得到答案之前,我们还是先下载jQuery Deferred。本文将告诉你为什么Deferred非常有用。(以下代码依赖于jQuery1.5或更高版本) Read more »


上海事久CD市場

上海是一個能把你積累的養分,輕易地消耗殆盡的地方。

急速、卻欠缺文化與人情味的沈澱。如果要繼續下去,你必須要自己找到補充的方法。DVD店是不分本地外地人的必然慰藉(難道看那被扭曲得不像人看的電視新聞?),可是對我們這種真的連DVD都要特意安排時間去看,下班後睡一個覺又就要上班的人來說,必須要有更handy、更即時的方法。猶如雞精或咖啡。

某天跟同事們吃飯,我的上海美指知道我是聽日本音樂長大的,就推薦我去長壽路葉家宅路(最近的地鐵站應該是七號線長壽路站)的事久市場,說我一定會愛上云云。既是美女推薦就去看看,結果……實是求是的說,改變了我的生活。

我變得,有快樂點了。

事久市場本來是一個賣雜貨建材的地方,有點像鴨寮街和大角咀新填地街的混合體。外地人沒有地頭蛇的介紹,大概不可能發現裡面別有洞天吧。 Read more »


如何判断ipad或者iphone是否为横屏或者竖屏 – portrait或者landscape

在ipad/iphone开发中我们往往需要判断用户目前的屏幕的位置,这样加以优化显示应用内容。今天这里我们分享一个jQuery的代码,能够有效帮助大家判断横屏或者竖屏。注意这里调用了jQuery的方法,所以你需要引用jQuery类库。 Read more »


CSS3学习:线性渐变(linear-gradient)

在切一块很大的渐变背景图时,突然想为啥不试试用css3来实现,撇开兼容问题开始学习这个有趣的css3属性。于是分别在MDCSRL找到了对应的文档,结果出乎预料的发现Gecko和webkit的实现方式竟然不一样,按以往的经验这两个的写法应该只是-moz和-webkit开头的区别(webkit已经更新了语法),分别来看下这个属性的两种写法: Read more »


修改浏览器 User-Agent

IE

 

  1. 修改IE的UserAgent需要编辑注册表。
  2. “HKEY_CURRENT_USER”Software”Microsoft”Windows”CurrentVersion”Internet Settings”5.0″User Agent”Post Platform”
  3. “HKEY_LOCAL_MACHINE”SOFTWARE”Microsoft”Windows”CurrentVersion”Internet Settings”User Agent”Post Platform”
  4. “HKEY_LOCAL_MACHINE”SOFTWARE”Microsoft”Windows”CurrentVersion”Internet Settings”5.0″User Agent”Post Platform”
  5. 如要修改IE的UserAgent为FireFox的,可以这么做:
  6. UserAgent的默认值改为”Firefox”,同时在Post Platform下面新建字符串值”Firefox”=”",注意修改后需重启IE。

FireFox

  1. 在地址栏输入“about:config”,按下回车进入设置菜单。
  2. 找到“general.useragent.override”,如果没有这一项,则点右键“新建”->“字符串”,输入这个字符串。
  3. 将其值设为自己想要的UserAgent。

Maxthon

工具栏“工具”->“遨游设置中心”->“高级选项”,勾选“自定义 UserAgent 字符串”,下面写上自己的UserAgent记可。保存设置后重启Maxthon生效。


Chrome

  1. 方法一:启动时加上参数:–user-agent=”你自己的UserAgent”。
  2. 方法二:修改chrome.dll。把里面疑似UserAgent的字符串改为自己的。

Safari

  1. 菜单栏“Edit”->“Preferences”->“Advanced”,勾选“Show Develop menu in menu bar”。
  2. 菜单栏会多出一项“Develop”,通过里面的“User Agent”子菜单即可设置自己的UserAgent。

php UBB 解析

今天看thinkphp演示文档看到这个ubb的代码感觉还可以。

/**
 +----------------------------------------------------------
 * UBB 解析
 +----------------------------------------------------------
 * @return string
 +----------------------------------------------------------
 */
function ubb($Text) {
      $Text=trim($Text);
      $Text=ereg_replace("\n","<br>",$Text);
      $Text=preg_replace("/\\t/is","  ",$Text);
      $Text=preg_replace("/\[hr\]/is","<hr>",$Text);
      $Text=preg_replace("/\[separator\]/is","<br/>",$Text);
      $Text=preg_replace("/\[h1\](.+?)\[\/h1\]/is","<h1>\\1</h1>",$Text);
      $Text=preg_replace("/\[h2\](.+?)\[\/h2\]/is","<h2>\\1</h2>",$Text);
      $Text=preg_replace("/\[h3\](.+?)\[\/h3\]/is","<h3>\\1</h3>",$Text);
      $Text=preg_replace("/\[h4\](.+?)\[\/h4\]/is","<h4>\\1</h4>",$Text);
      $Text=preg_replace("/\[h5\](.+?)\[\/h5\]/is","<h5>\\1</h5>",$Text);
      $Text=preg_replace("/\[h6\](.+?)\[\/h6\]/is","<h6>\\1</h6>",$Text);
      $Text=preg_replace("/\[center\](.+?)\[\/center\]/is","<center>\\1</center>",$Text);
      //$Text=preg_replace("/\[url=([^\[]*)\](.+?)\[\/url\]/is","<a href=\\1 target='_blank'>\\2</a>",$Text);
      $Text=preg_replace("/\[url\](.+?)\[\/url\]/is","<a href=\"\\1\" target='_blank'>\\1</a>",$Text);
      $Text=preg_replace("/\[url=(http:\/\/.+?)\](.+?)\[\/url\]/is","<a href='\\1' target='_blank'>\\2</a>",$Text);
      $Text=preg_replace("/\[url=(.+?)\](.+?)\[\/url\]/is","<a href=\\1>\\2</a>",$Text);
      $Text=preg_replace("/\[img\](.+?)\[\/img\]/is","<img src=\\1>",$Text);
      $Text=preg_replace("/\[img\s(.+?)\](.+?)\[\/img\]/is","<img \\1 src=\\2>",$Text);
      $Text=preg_replace("/\[color=(.+?)\](.+?)\[\/color\]/is","<font color=\\1>\\2</font>",$Text);
      $Text=preg_replace("/\[colorTxt\](.+?)\[\/colorTxt\]/eis","color_txt('\\1')",$Text);
      $Text=preg_replace("/\[style=(.+?)\](.+?)\[\/style\]/is","<div class='\\1'>\\2</div>",$Text);
      $Text=preg_replace("/\[size=(.+?)\](.+?)\[\/size\]/is","<font size=\\1>\\2</font>",$Text);
      $Text=preg_replace("/\[sup\](.+?)\[\/sup\]/is","<sup>\\1</sup>",$Text);
      $Text=preg_replace("/\[sub\](.+?)\[\/sub\]/is","<sub>\\1</sub>",$Text);
      $Text=preg_replace("/\[pre\](.+?)\[\/pre\]/is","<pre>\\1</pre>",$Text);
      $Text=preg_replace("/\[emot\](.+?)\[\/emot\]/eis","emot('\\1')",$Text);
      $Text=preg_replace("/\[email\](.+?)\[\/email\]/is","<a href='mailto:\\1'>\\1</a>",$Text);
      $Text=preg_replace("/\[i\](.+?)\[\/i\]/is","<i>\\1</i>",$Text);
      $Text=preg_replace("/\[u\](.+?)\[\/u\]/is","<u>\\1</u>",$Text);
      $Text=preg_replace("/\[b\](.+?)\[\/b\]/is","<b>\\1</b>",$Text);
      $Text=preg_replace("/\[quote\](.+?)\[\/quote\]/is","<blockquote>引用:<div style='border:1px solid silver;background:#EFFFDF;color:#393939;padding:5px' >\\1</div></blockquote>", $Text);
      $Text=preg_replace("/\1(.+?)\[\/code\]/eis","highlight_code('\\1')", $Text);
      $Text=preg_replace("/\1(.+?)\[\/php\]/eis","highlight_code('\\1')", $Text);
      $Text=preg_replace("/\[sig\](.+?)\[\/sig\]/is","<div style='text-align: left; color: darkgreen; margin-left: 5%'><br><br>--------------------------<br>\\1<br>--------------------------</div>", $Text);
      return $Text;
}

–vi 查找命令的使用

按下 Enter 键后,vi 将搜索指定的 pattern,并将光标定位在 pattern 的第一个字符处。
例如,要向上搜索 place 一词,请键入:
/place Enter (Enter表示按下回车键)

如果 vi 找到了 place,它将把光标定位在 p 处。要搜索 place 的其他匹配,请按 n 或 N:

n,继续朝同一方向搜索 place。

N,反方向进行搜索。
如果 vi 未找到指定的 pattern,光标位置将不变,屏幕底部显示以下消息:

Pattern: 未找到
=========================
4.5.1 搜索特殊匹配
在上面的示例中,vi 查找到包含 place 的任何序列,其中包括 displace、placement 和 replaced。

要查找单个的完整的单词 place,请键入该单词,并在其前后各加一个空格:

/ place Enter

要查找仅出现在行首的 place,请在该单词前加一个插字符号 (^):==>该字符是Shift-数字6

/^place Enter

要查找仅出现在行尾的 place,请在该单词后加一个货币符号 ($):

/place$ Enter
======================
那么我要搜索^和$这种特殊字符怎么办?
======================
使用 ^
要逐字搜索这种带有插字符号 (^) 或货币符号 ($) 的字符,请在字符前加一个反斜线 (\)。
反斜线命令 vi 搜索特殊字符。
======================
使用 $
特殊字符是指在 vi 中具有特殊功能的字符(例如 ^、$、*、/ 和 .)。例如,$ 通常表示“转至行尾”,但是,如果 $ 前紧跟一个 \,则 $ 只是一个普通的字符。
======================
使用 \
例如,/(No \$ money) 向上搜索字符序列 (No $ money)。紧跟在 $ 之前的转义字符 (\) 命令 vi 逐字搜索货币符号。
======================


Mac OS X 默认中文字体

mac_ch_1

默认细黑体与黑体(Hei)设计与默认行距的比较

这个题目大概只适用于技术限制较大的网页设计师。不过花了很多时间都得不到答案,放上来大家参考。 Read more »


Xcode iOS PhoneGap入门

本文介绍了利用Xcode建立PhoneGap应用程序环境和工作流程所需的步骤,该应用程序的目标是iOS设备。 Xcode是由Apple提供用来开发OS X和iOS应用程序的集成开发环境(IDE)。 其中,iOS是Apple的iPhone、iPad和iPod触摸设备的移动操作系统。 PhoneGap是开源的应用程序平台,它能够让你使用HTML和JavaScript创建本地安装的移动应用程序。 Read more »


JavaScript对象创建:学会无“新”生存

Content

在本文中,我将讨论通过使用 原型继承 (prototypal inheritance) 替代 new 替代新运算符来进行JavaScript的对象创建。

JavaScript的一个重要特点是很少使用单一的正确方法 执行任何特定的任务。 JavaScript是一种类型松散、动态并且富有表现力的语言,这意味着通常可以使用许多不同的方法来实现同一任务。 然而,我并未说本文讨论的创建对象的方法是唯一正确的方法,甚至是最好的方法,但是,如果你选择使用其它的方法,我的确觉得它更接近这种语言的真实本质,并且它能够帮助你了解背后究竟发生什么情况。

为了帮助你更好地了解这些概念,本文将描述了具有多个渲染目标的基本粒子系统。 描述我将演示的概念的实际测试是一个相当复杂的任务,而不是简单的 hello world 类型的应用程序。 Read more »


AI自由变换工具使用技巧

AI里面的自由变换工具不能跟PS里面一样按住CTRL然后随便拖?

当然可以的,方法如下:

先选中需要变换的图形元素(如果是文字,需要先将文字全部转曲线),在选中自由变换工具(E),先在定界框的角点上拖拉,确定可以进行缩放,不要松开鼠标的同时
按下Ctrl键,可进行单点扭曲;
按下Ctrl+Alt键,可对角点扭曲;
按下Ctrl+Shift键,可斜切;
按下Ctrl+Shift+Alt键,可透视

很神奇吧