日历
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | 5 | |||||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
| 13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
| 20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
| 27 | 28 | 29 | 30 | 31 | |||||
搜索标题
-
关于存储多个复选框的一点经验 *
2008-04-13 09:48:45
1.形如这样例子的存储
1.jpg
每个人建个字段的话太麻烦,操作起来太费事
数据库这样建:
是否有高血压:havegaoxueya
有高血压的的人:havegaoxueyaer
。。。
保存的时候
读取的时候 -
几道PHP算法题目 *
2007-11-15 12:17:40
1、给两个字符串s1,s2,定义字符串之间的距离d(s1,s2)为通过如下操作使两个字符
串一样的最少次数:
1.替换其中一个字符
2.删除一个字符
3.插入一个字符
例如:kooxoo.com与kooxoo.cn的距离为2,12344与1244的距离为1
给出任意两个字符串,求其距离,要求给出算法并分析时间复杂度
2、输入一个1~1亿的数字,打印中文,注意特殊情况
例如,输入7,打印七,123打印一百二十三
3、将一张考试卷的内容,看成一个文本文件,
题目形如: 1.1.。。。。。。。(3分)
(假设非空行最后字符均为空格)
要求实现检索出题号及其分值,并输出类似如下的:
1.1 3分
1.2 3分
1.3 5分
4、写算法和设计思想(越详细越好),并分析复杂度:
针对:输入框中输入字符,下面会动态匹配的那种功能
比如在搜索框中输入,上,会动态匹配:
上海 40000次搜索
商业 30000次搜索
酷讯的笔试题,暂时就这么多 -
12条优化PHP的小提示
2007-06-02 18:28:20
1、If a method can be static, declare it static. Speed improvement is by a factor of 4.
1、如果一个函数可以声明为静态的,那么就用静态的,速度是改进的一个因素4.2、# Avoid magic like __get, __set, __autoload
2、避免使用__get, __set, __autoload等魔术函数3、require_once() is expensive
3、require_once()是相当昂贵的。4、Use full paths in includes and requires, less time spent on resolving the OS paths.
4、用include和require时,尽量用全路径,可以减少花在解决OS路径的时间5、If you need to find out the time when the scrīpt started executing, $_SERVER[’REQUEST_TIME’] is preferred to time()
5、如果你需要知道一个脚本的开始运行时间,用 $_SERVER[’REQUEST_TIME’]比用time()要好
6、See if you can use strncasecmp, strpbrk and stripos instead of regex
6、如果可以用strncasecmp, strpbrk and stripos就别用正则7、preg_replace is faster than str_replace, but strtr is faster than preg_replace by a factor of 4
7、preg_replace比str_replace要快,但是strtr比preg_replace更快8、If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments.
一些函数,比如字符串替换函数,接受数组和单个字符做为参数,并且如果你的参数列表不是很长,考虑写一些冗余替换语句,每次传送一个字符,代替一行代码接受数组做为查找和替换的参数。9、Error suppression with @ is very slow.
9、禁止错误输出符号@是非常慢的。10、$row[’id’] is 7 times faster than $row[id]
10、、$row[’id’]比 $row[id]快7倍11、Error messages are expensive
11、错误信息是非常昂贵的12、Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.
12、不要在循环内部使用函数,比如: for ($x=0; $x < count($array); $x)。count()函数在每次循环中都会被调用。对于模板,你是否在用smarty?这可能是保证把最经常访问的页面缓存起来的最快的方法了。
-
使用php的几个小技巧zz
2007-05-26 17:31:01
php的一些小技巧
1. str_replace
str_replace是非常常常常常用的php函数,用于字符串替换,经常看到某些php新人为了替换一批字符串,写了好多行str_replace,实在是惨不忍睹。
比如这个例子:
PHP:-
$str = '某人的栖息地 --- www.ooso.net';
-
$str = str_replace('某人', '坏人', $str);
-
$str = str_replace('的', 'di', $str);
-
$str = str_replace('栖息地', '猪窝窝', $str);
-
$str = str_replace('www.ooso.net', 'ooso.net', $str);
以上,替换了4次字符串,实际只要换个写法,一行就搞定了:
PHP:-
$str = '某人的栖息地 --- www.ooso.net';
-
$str = str_replace(array('某人', '的', '栖息地', 'www.ooso.net'), array('坏人', 'di', '猪窝窝', 'ooso.net'), $str);
2. array
经常看到有人拿数组这样写:
echo $arr[some_key];上面这行代码能跑,看上去也没什么大问题,但是如果你把php.ini的error notice打开的话,会收到一大批error。php解析器首先是拿“some_key”当作一个常量来解释的,但如果没有定义some_key这样一个常量,解析器还是很宽容的把它当作了一个字符串来看待。因此新人同学们最好写完整一点:
echo $arr['some_key'];这样就没有问题了,如果你要把它放在双引号中连用,也不能省掉引号,可以这样写:
echo "这是混在双引号中的字符串{$arr['some_key']}";3. 类型戏法
类型戏法相当好用,比如有一个表单提交过来的变量,正常情况下它应该是整型的,有时候偷懒省去校验的写法可以是这样的:
$intVar = (int)$_POST['post_var'];再比如数组,有时候写键值要打引号是不是很不爽啊,我们可以把它转换成object,比如:
$arr = array('name' => 'volcano', 'sex' => 'male');-
$arr = (object)$arr;
-
-
echo $arr->name;
-
echo $arr->sex;
是不是很省事?
4. lambda函数
lamda函数和array_*系列函数使用有奇效,拿php手册上的一个例子来说:
-
<?php
-
$av = array("the ", "a ", "that ", "this ");
-
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
-
print_r($av);
-
?>
至少省了一个for循环
5. 嵌套循环显示表格的单元格
嵌套循环显示表格的单元格,这是一个很老的话题哦,往往会要在某个单元格后边加个条件判断什么的,考虑是不是要输出tr抑或是td标签。
俺这里介绍一个办法,利用array_chunk函数能够比较工整的输出html,见下例,这个例子要输出一个4行6列的表格:
<?php-
$arr = range(1, 24); //这个会生成一个数组array(1,2,3,4....24)
-
$arr = array_chunk($arr, 6);
-
-
// output table
-
?>
-
-
<table>
-
<?php foreach($arr as $row): ?>
-
<tr>
-
<?php foreach($row as $col):?>
-
<td><?php echo $col?></td>
-
<?php endforeach;?>
-
</tr>
-
<?php endforeach;?>
-
</table>
-
-
PHP中的实用函数
2007-05-24 18:49:17
1、关于PHP重定向
2、获取访问者浏览器方法一:header("Location: index.php");
方法二:echo "<scrīpt>window.location ="$PHP_SELF";</scrīpt>";
方法三:echo "<META HTTP-EQUIV="Refresh" CONTENT="0; URL=index.php">";CODE:function browse_infor()
{
$browser="";$browserver="";
$Browsers =array("Lynx","MOSAIC","AOL","Opera","JAVA","MacWeb","WebExplorer","OmniWeb");
$Agent = $GLOBALS["HTTP_USER_AGENT"];
for ($i=0; $i<=7; $i++)
{
if (strpos($Agent,$Browsers[$i]))
{
$browser = $Browsers[$i];
$browserver ="";
}
}
if (ereg("Mozilla",$Agent) && !ereg("MSIE",$Agent))
{
$temp =explode("(", $Agent); $Part=$temp[0];
$temp =explode("/", $Part); $browserver=$temp[1];
$temp =explode(" ",$browserver); $browserver=$temp[0];
$browserver =preg_replace("/([d.]+)/","1",$browserver);
$browserver = " $browserver";
$browser = "Netscape Navigator";
}
if (ereg("Mozilla",$Agent) && ereg("Opera",$Agent))
{
$temp =explode("(", $Agent); $Part=$temp[1];
$temp =explode(")", $Part); $browserver=$temp[1];
$temp =explode(" ",$browserver);$browserver=$temp[2];
$browserver =preg_replace("/([d.]+)/","1",$browserver);
$browserver = " $browserver";
$browser = "Opera";
}
if (ereg("Mozilla",$Agent) && ereg("MSIE",$Agent))
{
$temp = explode("(", $Agent); $Part=$temp[1];
$temp = explode(";",$Part); $Part=$temp[1];
$temp = explode(" ",$Part);$browserver=$temp[2];
$browserver =preg_replace("/([d.]+)/","1",$browserver);
$browserver = " $browserver";
$browser = "Internet Explorer";
}
if ($browser!="")
{
$browseinfo = "$browser$browserver";
}
else
{
$browseinfo = "Unknown";
}
return $browseinfo;
}
//调用方法$browser=browseinfo() ;直接返回结果
3、获取访问者操作系统
CODE:function osinfo() {
$os="";
$Agent = $GLOBALS["HTTP_USER_AGENT"];
if (eregi('win',$Agent) && strpos($Agent, '95')) {
$os="Windows 95";
}
elseif (eregi('win 9x',$Agent) && strpos($Agent, '4.90')) {
$os="Windows ME";
}
elseif (eregi('win',$Agent) && ereg('98',$Agent)) {
$os="Windows 98";
}
elseif (eregi('win',$Agent) && eregi('nt 5.0',$Agent)) {
$os="Windows 2000";
}
elseif (eregi('win',$Agent) && eregi('nt',$Agent)) {
$os="Windows NT";
}
elseif (eregi('win',$Agent) && eregi('nt 5.1',$Agent)) {
$os="Windows XP";
}
elseif (eregi('win',$Agent) && ereg('32',$Agent)) {
$os="Windows 32";
}
elseif (eregi('linux',$Agent)) {
$os="Linux";
}
elseif (eregi('unix',$Agent)) {
$os="Unix";
}
elseif (eregi('sun',$Agent) && eregi('os',$Agent)) {
$os="SunOS";
}
elseif (eregi('ibm',$Agent) && eregi('os',$Agent)) {
$os="IBM OS/2";
}
elseif (eregi('Mac',$Agent) && eregi('PC',$Agent)) {
$os="Macintosh";
}
elseif (eregi('PowerPC',$Agent)) {
$os="PowerPC";
}
elseif (eregi('AIX',$Agent)) {
$os="AIX";
}
elseif (eregi('HPUX',$Agent)) {
$os="HPUX";
}
elseif (eregi('NetBSD',$Agent)) {
$os="NetBSD";
}
elseif (eregi('BSD',$Agent)) {
$os="BSD";
}
elseif (ereg('OSF1',$Agent)) {
$os="OSF1";
}
elseif (ereg('IRIX',$Agent)) {
$os="IRIX";
}
elseif (eregi('FreeBSD',$Agent)) {
$os="FreeBSD";
}
if ($os=='') $os = "Unknown";
return $os;
}
//调用方法$os=os_infor() ;
4、文件格式类
CODE:$mime_types = array(
'gif' => 'image/gif',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'bmp' => 'image/bmp',
'png' => 'image/png',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'pict' => 'image/x-pict',
'pic' => 'image/x-pict',
'pct' => 'image/x-pict',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'psd' => 'image/x-photoshop',
'swf' => 'application/x-shockwave-flash',
'js' => 'application/x-javascrīpt',
'pdf' => 'application/pdf',
'ps' => 'application/postscrīpt',
'eps' => 'application/postscrīpt',
'ai' => 'application/postscrīpt',
'wmf' => 'application/x-msmetafile',
'css' => 'text/css',
'htm' => 'text/html',
'html' => 'text/html',
'txt' => 'text/plain',
'xml' => 'text/xml',
'wml' => 'text/wml',
'wbmp' => 'image/vnd.wap.wbmp',
'mid' => 'audio/midi',
'wav' => 'audio/wav',
'mp3' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'avi' => 'video/x-msvideo',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'lha' => 'application/x-lha',
'lzh' => 'application/x-lha',
'z' => 'application/x-compress',
'gtar' => 'application/x-gtar',
'gz' => 'application/x-gzip',
'gzip' => 'application/x-gzip',
'tgz' => 'application/x-gzip',
'tar' => 'application/x-tar',
'bz2' => 'application/bzip2',
'zip' => 'application/zip',
'arj' => 'application/x-arj',
'rar' => 'application/x-rar-compressed',
'hqx' => 'application/mac-binhex40',
'sit' => 'application/x-stuffit',
'bin' => 'application/x-macbinary',
'uu' => 'text/x-uuencode',
'uue' => 'text/x-uuencode',
'latex'=> 'application/x-latex',
'ltx' => 'application/x-latex',
'tcl' => 'application/x-tcl',
'pgp' => 'application/pgp',
'asc' => 'application/pgp',
'exe' => 'application/x-msdownload',
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'mdb' => 'application/x-msaccess',
'wri' => 'application/x-mswrite',
);
5、php生成excel文档CODE:<?
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=test.xls");
echo "test1t";
echo "test2tn";
echo "test1t";
echo "test2tn";
echo "test1t";
echo "test2tn";
echo "test1t";
echo "test2tn";
echo "test1t";
echo "test2tn";
echo "test1t";
echo "test2tn";
?>
//改动相应文件头就可以输出.doc .xls等文件格式了
6、时间比较问题
举一个简单例子说明:比如一个论坛对当天发表的贴子用new图片标记一下。
方法一:
CODE://$db->rows[$i][date]中为数据库中datetime字段值.
$today=time();
$theDay=date("Y-m-d H:i:s",$today-24*3600);
$newTag=$db->rows[$i][date]>=$theDay?"<img src='../image/newinfor.gif'>":"";
方法二:
CODE:$newTag=$db->rows[$i][date]>=date("Y-m-d 00:00:00")?"<img src='../image/newinfor.gif'>":"";
//提取页面和浏览器提交的变量,作用相当于使PHP.INI开了全局变量
CODE:@extract($_SERVER, EXTR_SKIP);
@extract($_SESSION, EXTR_SKIP);
@extract($_POST, EXTR_SKIP);
@extract($_FILES, EXTR_SKIP);
@extract($_GET, EXTR_SKIP);
@extract($_ENV, EXTR_SKIP);
//得到ip地址
CODE:$ip=$_SERVER['REMOTE_ADDR'];
$ip1 = getenv('HTTP_X_FORWARDED_FOR');
if (($ip1 != "") && ($ip1 != "unknown")) $ip=$ip1;
//读取文件函数
CODE:function readfromfile($file_name) {
if (file_exists($file_name)) {
$filenum=fopen($file_name,"r");
flock($filenum,LOCK_EX);
$file_data=fread($filenum, filesize($file_name));
rewind($filenum);
fclose($filenum);
return $file_data;
}
}
//写入文件函数
CODE:function writetofile($file_name,$data,$method="w") {
$filenum=fopen($file_name,$method);
flock($filenum,LOCK_EX);
$file_data=fwrite($filenum,$data);
fclose($filenum);
return $file_data;
}
//页面快速转向
CODE:function turntopage($url="index.php",$info = "页面转向中...",$second=2){
print "<html>n<head>n<title>页面转向中....</title>n";
print "<meta http-equiv="refresh" content="$second;url=$url">n";
print "<style type="text/css">n<!--n";
print "td { font-family: "Verdana", "Arial";font-size: 12px}n";
print "A {COLOR: #000000; TEXT-DECORATION: none}n";
print "-->n</style>n";
print "</head>n<body>n";
print "<table width="100%" border="0" align="center">n";
print " <tr>n";
print " <td height="200"> </td>n";
print " </tr>n";
print " <tr>n";
print " <td align="center">n";
print " <table width="60%" border="0" cellpadding="8" bgcolor="#AA9FFF">n";
print " <tr>n";
print " <td height="30" align="center">页面转向提示信息</td>n";
print " </tr>n";
print " <tr>n";
print " <td align="center">$info</td>n";
print " </tr>n";
print " <tr>n";
print " <td align="center">n";
print " <a href="$url">如果你的浏览器不支持自动跳转,请按这里</a></td>n";
print " </tr>n";
print " </table></td>n";
print " </tr>n";
print " <tr>n";
print " <td height="200"> </td>n";
print " </tr>n";
print "</table>n";
print "</body>n</html>";
exit; -
zz使用PHP 快速生成Flash 动画
2007-05-22 21:09:13
Web 2.0 引入了 Rich Internet Application。但 Rich Internet Application 的含义是什么?通常,它意味着向应用程序中添加具有高度响应能力的交易操作。具体来说,它意味着可以即时更改页面中的小部件、Web 表单和报告,而无需从服务器中检索新页面。
一种用于构建 Rich Internet Application(RIA)的方法就是使用动态 HTML(Dynamic HTML,DHTML),它是 Ajax、Javascrīpt、层叠样式表(Cascading Style Sheet,CSS)和 HTML 的组合(请参阅 参考资料)。但是 DHTML 并不是向 Web 应用程序中添加互动操作的惟一方法。另一种重要方法是使用 Adobe Flash Player,使用它为 Web 站点添加交互操作已经有十年的历史。
第一版的 Flash 曾是用于创建动画图片的工具,而最新版本的 Flash 已经可以托管一个完整的界面,可用于控制 Web 服务访问并使用 ECMAscrīpt(Javascrīpt 的正式版本)来提供完整的脚本支持。
了解 Flash
Flash Player 是集成到运行 Microsoft® Windows®、Mac OS X 和 Linux® 的计算机的 Web 浏览器中的一个插件。截至本文完稿时,最新版本的 Flash Player 是 V8。它是可以免费获得的,大多数浏览器都附带安装了此插件。它十分流行并且具有优秀的客户机渗透力 —— 而这种渗透力随着 YouTube 和 Google Video 这类服务的出现得到了提高,这些服务都使用 Flash 显示视频流。
Flash Player 只是天平的一端。要发挥作用,Flash Player 还需要使用一个 Flash 动画。此类动画通常是使用一种 Flash 的开发工具编译的文件,其文件扩展名为 .swf。但正如您将在本文中看到的那样,还可以使用 Ming 库用几乎与动态创建图片相同的方法来动态构建 .swf 文件,并在 Web 服务器上绘制图形。Ming 库利用由 PHP 代码构建的对象和方法在新的 .swf 文件中构建操作代码。
您可以通过两种方法中的任意一种方法来查看 Web 站点中的 .swf 文件。第一种方法只需导航到 .swf 文件的 URL。这样做将把 Web 服务器的整个内容区域替换为 Flash 动画。此方法便于进行调试,但主要的用法还是将动画嵌入到 HTML Web 页面的
<object>标记中。该<object>标记然后再通过 URL 引用 SWF 动画。<object>方法的优点在于您可以把动画放在页面的任意位置,并可通过 Javascrīpt 代码进行动态控制,就像处理页面中的任何其他元素一样。清单 1 显示的是一个引用 SWF 动画的
<object>标记的示例。
清单 1. 嵌入式 Flash 动画
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab# version=6,0,40,0" WIDTH="550" HEIGHT="400"> <PARAM NAME="movie" VALUE="lines.swf"> <EMBED src="lines.swf" WIDTH="550" HEIGHT="400" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"> </EMBED> </OBJECT>
这组标记将引用一个名为 lines.swf 的动画。内部的
<embed>标记用于确保 Flash 动画可以在安装了插件的各种浏览器中播放。标记还把 Flash Player 的高度和宽度分别指定为 550 像素和 400 像素。非常值得注意的是,Flash 动画中的图形都是基于矢量的,这意味着当您使用 Flash 命令绘制线条和文本时,那些元素都被存储为坐标并且按照匹配显示区域的比例进行缩放。如您所见,Flash 动画有自己的坐标系统,您可以按照适合自己的方法使代码尽可能整洁。
Ming
本文中提供的使用 Flash 动画的第一种方法是使用 Ming 库动态生成它们。Ming 库是一个 PHP 库,其中有一组映射到 SWF 动画中的数据类型的对象:子图形、图形、文本、位图等等。我将不讨论如何构建和安装 Ming,因为其操作是特定于平台的而且并不特别简单(请参阅 参考资料)。在本文中,我使用了预编译的扩展 php_ming.dll 库用于 Windows 版本的 PHP。
必须指出的是,Ming 仍处于开发阶段。截至本文完稿时,库的版本是 V0.4,并且较老版本中的一些命令在最新版本中不能使用。我使用了 V0.4 撰写本文,因此,要使用这段代码,您需要使用这个版本。
清单 2 显示了使用 Ming 库实现的 HelloWorld 示例。
清单 2. Hello.php
<?php $f = new SWFFont( '_sans' ); $t = new SWFTextField(); $t->setFont( $f ); $t->setColor( 0, 0, 0 ); $t->setHeight( 400 ); $t->addString( 'Hello World' ); $m = new SWFMovie(); $m->setDimension( 2500, 800 ); $m->add( $t ); $m->save( 'hello.swf' ); ?>
在命令行中运行这段代码将生成文件 hello.swf。当我在 Web 浏览器中打开该文件时,看到了图 1 所示的结果。
图 1. 使用 Ming 的 HelloWorld 示例
回过头来查看这段代码,我做的第一件事是创建指向一个内置字体(_sans)的指针,然后创建文本字段,设定字体、颜色和大小,最后为其提供一些文本内容(“Hello World”)。再接下来创建了一个SWFMovie对象并设定其尺寸。最后,向动画中添加了文本元素并将动画保存到文件中。作为直接构建文件的替代性方法,也可以使用下面的代码,使 SWF 动画像页面那样输出,而无需使用 save 方法:
header( 'Content-type: application/x-shockwave-flash' ); $m->output( );
此过程类似于使用 PHP 中的 ImageMagick 库来构建位图。对于所有 Ming 示例,我都将使用 save 方法,但您可以根据喜好来选择是否使用 save 方法。
让文本动起来
只是将一些文本放入 Flash 动画中是没有多大意义的,除非您能让它动起来。因此我整合了清单 2 中的示例,它包括两段文本:一部分开始很小后来变得越来越大,而另一部分保持静态。
清单 3. Text.php
<?php $f = new SWFFont( '_sans' ); $pt = new SWFTextField(); $pt->setFont( $f ); $pt->setColor( 0, 0, 0 ); $pt->setHeight( 400 ); $pt->addString( '1000' ); $tt = new SWFTextField(); $tt->setFont( $f ); $tt->setColor( 192, 192, 192, 90 ); $tt->setHeight( 350 ); $tt->addString( 'Points' ); $m = new SWFMovie(); $m->setDimension( 2500, 800 ); $pts = $m->add( $pt ); $pts->moveTo( 0, 0 ); $tts = $m->add( $tt ); $tts->moveTo( 1300, 200 ); for( $i = 0; $i < 10; $i++ ) { $m->nextframe(); $pts->scaleTo( 1.0 + ( $i / 10.0 ), 1.0 + ( $i / 10.0 ) ); } $m->save( 'text.swf' ); ?>
在命令行中执行这段代码时,它将生成 text.swf。在 Web 浏览器中打开该文件时,我看到了图 2 所示的图片。
图 2. text.swf 文件
文本 “1000” 开始时很小,大小为 350 个点。然后使用
scaleTo()方法使其增大为 750 个点,方法是对动画对象使用nextframe()方法。要理解其工作原理,需要了解一点 Flash 制作动画的方法。Flash 中的动画就像电影中的动画一样运行:按帧运行。子图形将按帧在动画框架中移动。一个主要差别是 Flash 不获取每帧的快照。它存储子图形对象在每帧的状态。
您可能会注意到,我有一个名为
$pt的变量,该变量具有文本 “1000”。随后当我把$pt添加到动画中时,获得了通过add()方法返回的名为$pts的新对象。该对象是SWFDisplayItem,表示子图形的实例。然后我可以围绕动画框架的表面逐帧移动实例。这有点儿混乱,但我可以拥有同时移动的多个版本的 “1000” 文本子图形或 “points” 文本子图形。绘制一些图形
接下来要处理的是矢量图形。首先仅绘制一条简单的直线,它从框架的左侧顶部到右侧底部。
清单 4. Line.php
<?php $m = new SWFMovie(); $m->setDimension( 300, 300 ); $s = new SWFShape(); $s->setLine( 10, 0, 0, 0 ); $s->movePenTo( 10, 10 ); $s->drawLineTo( 290, 290 ); $m->add( $s ); $m->save( 'line.swf' ); ?>
在命令行中运行此脚本,然后查看输出的 .swf 文件,效果如图 3 所示。
图 3. 绘制简单的直线
好的 —— 这十分简单,也不怎么令人激动。那么我做了什么?创建了一个新的
SWFShape对象,然后向其中添加了一些笔触移动和直线。然后我将其作为子图形添加到了动画中。为了让它变得更有趣,我使用了与刚才文本中使用的相同的帧式动画。但在本例中,我用下面所示的代码使这条直线围绕动画的中心旋转。
清单 5. 旋转直线
<?php $m = new SWFMovie(); $m->setDimension( 300, 300 ); $s = new SWFShape(); $s->setLine( 5, 0, 0, 0 ); $s->movePenTo( -100, -100 ); $s->drawLineTo( 100, 100 ); $ts = $m->add( $s ); $ts->moveTo( 150, 150 ); for( $i = 0; $i < 100; $i++ ) { $ts->rotate( 10 ); $m->nextframe(); } $m->save( 'rotate.swf' ); ?>
在本例中,我从 -100, -100 到 100, 100 画了一条直线。这将把直线的中心放在坐标 0,0 处。这样,当我在旋转图形时,直线的中心将发生旋转。
当我向动画中添加图形时,将移动返回到框架中心的
SWFDisplayItem。然后用rotate()方法使它旋转并每旋转一周就增大其框架。使用图片
文本和诸如直线、圆、弧、曲线和矩形之类的简单矢量图形都是十分优秀的,但在理想的情况下,您必须能访问这些 Flash 动画中的图片。值得庆幸的是,Ming 库使您可以轻松的使用图片,如下所示。
清单 6. 使用图片
<?php $img = new SWFBitmap( file_get_contents( 'megan.jpg' ) ); $s = new SWFShape(); $imgf = $s->addFill( $img ); $s->setRightFill( $imgf ); $s->movePenTo( 0, 0 ); $s->drawLineTo( $img->getWidth(), 0 ); $s->drawLineTo( $img->getWidth(), $img->getHeight() ); $s->drawLineTo( 0, $img->getHeight() ); $s->drawLineTo( 0, 0 ); $m = new SWFMovie(); $m->setDimension( $img->getWidth() * 2, $img->getHeight() * 2 ); $is = $m->add( $s ); $is->moveTo( $img->getWidth() / 2, $img->getHeight() / 2 ); for( $i = 0; $i < 10; $i++ ) { $is->skewx( 0.02 ); $is->skewy( -0.03 ); $m->nextframe(); } $m->save( 'image.swf' ); ?>
在命令行中运行此脚本并在浏览器中查看 image.swf,结果如图 4 所示。
图 4. 生成的图片动画
此脚本在开始时读取了本地的 .jpeg 文件(在本例中,是我女儿 Megan 的照片)。然后创建一个矩形,并在其中填充图片。在那之后,它在10 帧处使用了位移效果使图片稍微移动。
继续移动
我只是触及了 Ming 库可为您提供的操作的表面。在这里我没有展示交互部分,在交互部分您可以将简单的脚本与元素连接起来。(但是,如果换成是交互操作,如果您有一个十分复杂的 Flash 动画,则可能需要考虑使用 Flash 开发工具来构建 Web 应用程序内与 Web 服务对话的 Flash 动画。)
构建更加复杂的 Flash 动画的另外一种选择是使用诸如 Adobe Flex 或 Laszlo 之类的制作工具,这两种工具都提供了用于为 Flash 动画的用户界面布局的 XML 语法以及一个更轻松地例程,可用于开发为界面提供互动操作的 Javascrīpt。
XML Chart 和 XML Gauge
给我留下深刻印象的两个 Flash SWF 是 XML Chart 和 XML Gauge,可在 maani.us 获得(请参阅 参考资料)。使用动画就可以轻松地为 Web 站点提供动态的规格和图形,您只需在 PHP 应用程序中创建 XML 页面。
第一步是从站点下载 SWF。然后将其嵌入到 Web 页面的
<object>标记中并将 URL 提供给 XML 数据摘要。制作一个 PHP 页面按照控制所需的格式导出 XML。这些动画的 XML 格式在站点中得到了详细说明并且非常易于创建。结束语
Flash 带来了一种机会,使您可轻松将大量交互操作添加到 Web 应用程序。就像一些小部件样式的控件一样,从微不足道开始,变得越来越流行。XML Chart 和 XML Gauge 提供了机会让您在投入大量时间了解 Ming、Flex 或 Laszlo 之前先尝试使用这些类型的 Flash 小部件。无论如何,值得花时间去了解 Flash 及其功能来扩展 Web 2.0 PHP 应用程序的功能及交互操作。
-
PHP常用正则表达式
2007-05-22 21:07:54
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。PHPChina 开源社区门户.HP7?``.Uqf2{
PHPChina 开源社区门户,wd E3?SN*e
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
s3_!O7g)K(M31423评注:匹配中文还真是个头疼的事,有了这个表达式就好办了PHPChina 开源社区门户0Gt4Y.s Y)TB y
PHPChina 开源社区门户 LJ9Q}@[ ^
匹配双字节字符(包括汉字在内):[^\x00-\xff]PHPChina 开源社区门户\qC%z#Y R{
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)PHPChina 开源社区门户Cn1ha9H]&w
R ? sZ(X.a!|N31423匹配空白行的正则表达式:\n\s*\r
G ]a%E"y)bX31423评注:可以用来删除空白行
[M7iWs31423
E-w8wt(s2B31423匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?\1>|<.*? />PHPChina 开源社区门户Q;pG6lM0cZUJ+]
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力PHPChina 开源社区门户J&n#].c%m j FU
@X4L `I9yh31423匹配首尾空白字符的正则表达式:^\s*|\s*$PHPChina 开源社区门户(d-e`b4Y-X^6V"n
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式PHPChina 开源社区门户*n!_ro4ou/woz
.@!Z$XL,N"v31423匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
Dl1`[q}B;x31423评注:表单验证时很实用PHPChina 开源社区门户 PO5[ oY+}0A
7bm;U(E9\9\,B31423匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*PHPChina 开源社区门户3e2pz0D~ u4X
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
Y0r r8kz*?31423
L4h*bhil31423匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
Z8]jp|?)Q2x'^31423评注:表单验证时很实用
1c#C |Oh7u'tUC31423PHPChina 开源社区门户r4Q`$A Onx
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}PHPChina 开源社区门户:f B~hY+X-CQ
评注:匹配形式如 0511-4405222 或 021-87888822
u1q#\4E@W31423
q_ TY+Nt2b {*ZA31423匹配腾讯QQ号:[1-9][0-9]{4,}PHPChina 开源社区门户N+bktc
评注:腾讯QQ号从10000开始PHPChina 开源社区门户W4a R*g&pEgH[?
PHPChina 开源社区门户g L0OSs_u
匹配中国邮政编码:[1-9]\d{5}(?!\d)
0r`;k4g9t3Q31423评注:中国邮政编码为6位数字PHPChina 开源社区门户*B6J\e8Ry"v,x.^
_;L Ue.NJ1mk31423匹配身份证:\d{15}|\d{18}PHPChina 开源社区门户F)J#q*tskzYi
评注:中国的身份证为15位或18位PHPChina 开源社区门户1L1?&v"T@+A!iE2ZW
PHPChina 开源社区门户7x@0Q-A|9I4YQ
匹配ip地址:\d+\.\d+\.\d+\.\d+PHPChina 开源社区门户[,f [0To)Q/o|*U
评注:提取ip地址时有用PHPChina 开源社区门户8N$HcrY
Q9|s%SFk-V\31423匹配特定数字:
DXsg_(o#\31423^[1-9]\d*$ //匹配正整数
0w3[` O*@31423^-[1-9]\d*$ //匹配负整数
2d(Ljp9m-k31423^-?[1-9]\d*$ //匹配整数
x/y d,@O0H _31423^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)PHPChina 开源社区门户U4u$L2[X4O6|
^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)PHPChina 开源社区门户 VxE3ESS lI
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数PHPChina 开源社区门户8d#pB]'P"si7D
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
a(D(L9bE@'q&g)nZ31423^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数PHPChina 开源社区门户L p$EC\
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0)PHPChina 开源社区门户KG m G'rk
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数 + 0)PHPChina 开源社区门户wD!J.C|*gx
评注:处理大量数据时有用,具体应用时注意修正
VMo-^j?Nc^31423PHPChina 开源社区门户?,a"yd9?4U
匹配特定字符串:PHPChina 开源社区门户lmr#s w(j/?Ax#d]
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
l4xR T0WrZ31423^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
4g2w.D*NOI {&~3MUc/{u31423^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
;d{3p&cT H31423^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串PHPChina 开源社区门户bc(}fW
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串PHPChina 开源社区门户 gY&KUT K0E US'| G
评注:最基本也是最常用的一些表达式
ze'` bqB]31423
