登陆cvs: cvs -d :pserver:xuquanxing@218.206.74.186:/home/cvsroot login 将提示你输入密码,登陆成功后以后在登陆不需要密码 网管联盟bitsCN_com
检出整个工程(必须先检出整个工程,才能进行其它的操作) cvs -d :pserver:xuquanxing@218.206.74.186:/home/cvsroot checkout mindquiz 在执行update时可以转到本地相应目录直接 cvs update 也可以在其它目录cvs update 目录名
网管bitscn_com
(下面是网络上找到) 网管网www_bitscn_com
1.登陆cvs: cvs -d :pserver:xuquanxing@218.206.74.186:/home/cvsroot login
网管联盟bitsCN@com阅读全文
检出整个工程(必须先检出整个工程,才能进行其它的操作) cvs -d :pserver:xuquanxing@218.206.74.186:/home/cvsroot checkout mindquiz 在执行update时可以转到本地相应目录直接 cvs update 也可以在其它目录cvs update 目录名
网管bitscn_com
(下面是网络上找到) 网管网www_bitscn_com
1.登陆cvs: cvs -d :pserver:xuquanxing@218.206.74.186:/home/cvsroot login
网管联盟bitsCN@com阅读全文
实践:
ls AlTest1.err > log #有此文件,也就是输出指向屏幕给输入到了log文件
ls AlTest1.err2 > log #没有此文件,输出的是错误2,正常输出的1指向屏幕1----->log (1指向log),2也是指向幕,于是将错输出到了屏。
ls: AlTest1.err2: No such file or directory
ls AlTest1.err2 > log 2>&1 # (2指向1,而1指向log,因此2也指向了log)错误也指向了文件,于是此次的错误没有输出。
cat log
ls: AlTest1.err2: No such file or directory
2>&1 换个位置的情况,如下:
ls AlTest1.err2 2>&1 > log #输出:ls: AlTest1.err2: No such file or directory ,原因是2还是指向屏幕
本来1----->屏幕 (1指向屏幕)
执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
执行>log后, 1----->log (1指向log,2还是指向屏幕)
如果文件存在,1输出指向了log,所以下成这个语句是能输出到文件中的:
ls AlTest1.err 2>&1 > log
cat log
AlTest1.err
将上述的正确输出的文件换成/dev/null, 即可实现正确错误均给导入空洞。
来自:https://www.jb51.net/article/169778.htm
0:标准输出,1:标准输入,2:标准错误。 输出可以输出到控制台,也可输出到文件,从左向右的顺序,这样可理解后面思考题。
2>&1表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出),为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符。在前面我们知道,test.sh >log.txt又将文件描述符1的内容重定向到了文件log.txt,那么最终标准错误也会重定向到log.txt。
cat test.sh
#./test.sh > log.txt
./test.sh:行6: whatthis: 未找到命令
./test.sh:行6: whatthis: 未找到命令
./test.sh:行6: whatthis: 未找到命令
如果写成这样:#./test.sh > log.txt 2>&1 ,标准输出和错误输出均指向了 /data/codesdev/testdemo/shell/log.txt:
#ll
总用量 0
lrwx------ 1 root root 64 10月 30 16:38 0 -> /dev/pts/2
l-wx------ 1 root root 64 10月 30 16:38 1 -> /data/codesdev/testdemo/shell/log.txt
l-wx------ 1 root root 64 10月 30 16:37 2 -> /data/codesdev/testdemo/shell/log.txt
lr-x------ 1 root root 64 10月 30 16:38 255 -> /data/codesdev/testdemo/shell/test.sh
w
xiangdon pts/2 202.108.16.78 15:37 47.00s 0.10s 0.03s sshd: xiangdong [priv] #程序运行终端
xiangdon pts/3 202.108.16.78 15:40 0.00s 0.08s 0.03s sshd: xiangdong [priv] #另一个终端
pkill -KILL -t pts/3
cd /proc/28725/fd
我们总结一下前面的内容:
程序运行后会打开三个文件描述符,分别是标准输入,标准输出和标准错误输出。
在调用脚本时,可使用2>&1来将标准错误输出重定向。
只需要查看脚本的错误时,可将标准输出重定向到文件,而标准错误会打印在控制台,便于查看。
>>log.txt会将重定向内容追加到log.txt文件末尾。
通过查看/proc/进程id/fd下的内容,可了解进程打开的文件描述符信息。
来自:https://mp.weixin.qq.com/s/-9uO7lc_xfvpZxEsaez7HQ
#./test.sh 2>&1 >log.txt #思考题:为何这样一样有错误输出呢?
思考
下面的调用会将标准错误输出重定向到文件中吗?为什么?
./test.sh 2>&1 >log.txt
./test.sh:行6: whatthis: 未找到命令
./test.sh:行6: whatthis: 未找到命令
./test.sh:行6: whatthis: 未找到命令
./test.sh:行6: whatthis: 未找到命令
./test.sh:行6: whatthis: 未找到命令
./test.sh:行6: whatthis: 未找到命令
原因2 -> /dev/pts/2,并没有给指向/data/codesdev/testdemo/shell/log.txt:
#ll /proc/29313/fd
总用量 0
lrwx------ 1 root root 64 10月 30 16:44 0 -> /dev/pts/2
l-wx------ 1 root root 64 10月 30 16:44 1 -> /data/codesdev/testdemo/shell/log.txt
lrwx------ 1 root root 64 10月 30 16:44 2 -> /dev/pts/2
lr-x------ 1 root root 64 10月 30 16:44 255 -> /data/codesdev/testdemo/shell/test.sh
答案:解释一下思考题:不能。
因为从左往右结合,现有2>&1,这个时候1指向的是控制台,这个时候也就将标准错误2重定向控制台(相当于不起作用),最后才将标准输出重定向到log.txt。结果就是只有标准输出重定向到了log.txt。可以通过同样的方法查看文件描述符的指向。
从左往右结合:也就是说先有输出(2&>1:标准错误输出到文件1输出)到控制台(不起作用,此时输出是控制台。),然后再定向到log.txt文件,而不是先输出到Log文件,之前是test.sh >log.txt将文件描述符1的内容重定向到了文件log.txt,那么最终标准错误也会重定向到log.txt,现在是直接将错误给输出到终端了。
> 就是1,也就是说将标准输出到一个文件,它就是1,而./test.sh 2>&1 >log.txt ,的1是输出到默认的终端terminal了,而./test.sh >log.txt 2>&1里的输出1到文件了,后面的1也就跟着到了log.txt文件。
===============================================================================================
find -name "*.jpg" | awk -F "/" '{print "curl -F userfile=@/data1/app4_data/" $2 "/" $3 "
http://app.space.sina.com.cn/upload.php" " >> /home/xiangdong2/image_logs/" $3 ".txt"}' | sh
这个脚本放入:push_upload_img.sh http://app.space.sina.com.cn/upload.php" " >> /home/xiangdong2/image_logs/" $3 ".txt"}' | sh
中的时候出现:curl传输速度等的信息,我们就要用到:>/dev/null 2>&1 & 了
sh push_upload_img.sh >/dev/null 2>&1 &
详细解释:
脚本是:
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &
对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.其中0表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。
command >out.file 2>&1 &
command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。
试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.阅读全文
在一个目录很多图片想通过:rm -Rf 来删除,报错: Argument list too long
查找目录:find /(查找范围) -name '查找关键字' -type d
查找文件:find /(查找范围) -name 查找关键字 -print
最后通过:
find . -name "*.jpg" | xargs rm -Rf
完全解决!
find ./ -size 2265c | xargs rm 按指定大小删除
如想删除/tmp/xdebug下面所有的文件,用下面方法,一定要加type f,不加会把目录也删除了滴:
阅读全文
查找目录:find /(查找范围) -name '查找关键字' -type d
查找文件:find /(查找范围) -name 查找关键字 -print
最后通过:
find . -name "*.jpg" | xargs rm -Rf
完全解决!
find ./ -size 2265c | xargs rm 按指定大小删除
如想删除/tmp/xdebug下面所有的文件,用下面方法,一定要加type f,不加会把目录也删除了滴:
阅读全文
挑选5个字母的域名,并第一个字是w的awk正则方法:
下载文件
http://bbs.chinaunix.net/viewthread.php?tid=747708&extra=page%3D2
上传文件的curl参数是-T:
1)上传uploadContents.txt文件内容:
this is upload file by php.
2)接收代码:
来自plupload里通过swf一个文件小于自己配置的10M时就一次性上传的协议,Flash是这样进行提交的:
Content-Disposition: form-data; name="name" p18e57aitdkecp1vbe40lccu4.zip
XXXXXXXXXX 文件内容
3)运行打印:
C:\Users\admin>curl -d"dfd=php://input can not read here's contents" -T"D:\uploadContents.txt" http://localhost/php_input.php
this is upload file by php.
4)说明,对于-d参数,其PHP的php://input是不会接收的,其接收的是二进制流,用$_POST,是可以打印出来的(但通过linux下的shell同时发送-d -T是只能打出-T内容)。
如,通过给PHP里的php://input上传一个文件,发现这个文件不能被读取到,说明它就是只能接二进制文件的,如下:
C:\Users\admin>curl -F upload_file=@D:\uploadContents.txt -F "name=yangqi" http://localhost/php_input.php
-F/--form <name=content> Specify HTTP multipart POST data (H)
--form-string <name=string> Specify HTTP multipart POST data (H)
Array
(
[upload_file] => Array
(
[name] => uploadContents.txt
[type] => text/plain
[tmp_name] => D:\wamp\tmp\phpDAB9.tmp
[error] => 0
[size] => 76
)
)
Array
(
[name] => yangqi
)
接收代码如下:
_______________________分块传时是这样的_______________________________
Content-Disposition: form-data; name="name" p18e57g55eof2u6k19971jo1cvu8.zip
Content-Disposition: form-data; name="chunk" 0
Content-Disposition: form-data; name="chunks" 5
上传文件内容XXXX
______________________________________________________________________________________
更多参考如下Url:http://jackxiang.com/post/6421/
curl -F userfile=@/usr/local/apache2/conf/httpd.conf http://app.space.sina.com.cn/upload.php // 上传
curl -d "get=123&post=222" http://app.space.sina.com.cn/get_post.php //post
curl http://app.space.sina.com.cn/get_post.php?"post=888&get=1212" //引号引起来get
加上访问时间(注意:这儿的upload_file相当于控件html file的name):
curl -s -w '%{time_connect}:%{time_starttransfer}:%{time_total}' -F upload_file=@/home/xiangdong/uploadFileTest/buer.rmvb "http://up.xiyou.cntv.cn/uptest.php"
0.001:0.001:14.458
PHP扩展用Curl上传文件:
调用的实际上传:
附录Flash进行多文件上传时的代码,在单文件时是通过php:input,而多文件时是_FILES进行分块上传的,upload.php里的代码如下:
来自:http://www.oschina.net/code/snippet_12_5808
1)上传uploadContents.txt文件内容:
this is upload file by php.
2)接收代码:
来自plupload里通过swf一个文件小于自己配置的10M时就一次性上传的协议,Flash是这样进行提交的:
Content-Disposition: form-data; name="name" p18e57aitdkecp1vbe40lccu4.zip
XXXXXXXXXX 文件内容
3)运行打印:
C:\Users\admin>curl -d"dfd=php://input can not read here's contents" -T"D:\uploadContents.txt" http://localhost/php_input.php
this is upload file by php.
4)说明,对于-d参数,其PHP的php://input是不会接收的,其接收的是二进制流,用$_POST,是可以打印出来的(但通过linux下的shell同时发送-d -T是只能打出-T内容)。
如,通过给PHP里的php://input上传一个文件,发现这个文件不能被读取到,说明它就是只能接二进制文件的,如下:
C:\Users\admin>curl -F upload_file=@D:\uploadContents.txt -F "name=yangqi" http://localhost/php_input.php
-F/--form <name=content> Specify HTTP multipart POST data (H)
--form-string <name=string> Specify HTTP multipart POST data (H)
Array
(
[upload_file] => Array
(
[name] => uploadContents.txt
[type] => text/plain
[tmp_name] => D:\wamp\tmp\phpDAB9.tmp
[error] => 0
[size] => 76
)
)
Array
(
[name] => yangqi
)
接收代码如下:
_______________________分块传时是这样的_______________________________
Content-Disposition: form-data; name="name" p18e57g55eof2u6k19971jo1cvu8.zip
Content-Disposition: form-data; name="chunk" 0
Content-Disposition: form-data; name="chunks" 5
上传文件内容XXXX
______________________________________________________________________________________
更多参考如下Url:http://jackxiang.com/post/6421/
curl -F userfile=@/usr/local/apache2/conf/httpd.conf http://app.space.sina.com.cn/upload.php // 上传
curl -d "get=123&post=222" http://app.space.sina.com.cn/get_post.php //post
curl http://app.space.sina.com.cn/get_post.php?"post=888&get=1212" //引号引起来get
加上访问时间(注意:这儿的upload_file相当于控件html file的name):
curl -s -w '%{time_connect}:%{time_starttransfer}:%{time_total}' -F upload_file=@/home/xiangdong/uploadFileTest/buer.rmvb "http://up.xiyou.cntv.cn/uptest.php"
0.001:0.001:14.458
<?php
$uploaddir = '/home/xiangdong2/pic_all_here';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
echo 'Here is some more debugging info:';
print_r($_FILES);
}
?>
$uploaddir = '/home/xiangdong2/pic_all_here';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
echo 'Here is some more debugging info:';
print_r($_FILES);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>upload file</title>
</head>
<body>
<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="http://app.space.sina.com.cn/upload.php">
<label>
<input type="file" name="userfile" id="fileField" />
</label>
<label>
<input type="submit" name="button" id="button" value="upload" />
</label>
</form>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>upload file</title>
</head>
<body>
<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="http://app.space.sina.com.cn/upload.php">
<label>
<input type="file" name="userfile" id="fileField" />
</label>
<label>
<input type="submit" name="button" id="button" value="upload" />
</label>
</form>
</body>
</html>
<?php
if(isset($_REQUEST['get']))
{
$get =$_REQUEST['get'];
}else{
$get="get";
}
if(isset($_REQUEST['post']))
{
$post =$_REQUEST['post'];
}else{
$post="post";
}
echo "get=".$get."\n";
echo "post=".$post."\n";
?>
if(isset($_REQUEST['get']))
{
$get =$_REQUEST['get'];
}else{
$get="get";
}
if(isset($_REQUEST['post']))
{
$post =$_REQUEST['post'];
}else{
$post="post";
}
echo "get=".$get."\n";
echo "post=".$post."\n";
?>
PHP扩展用Curl上传文件:
调用的实际上传:
附录Flash进行多文件上传时的代码,在单文件时是通过php:input,而多文件时是_FILES进行分块上传的,upload.php里的代码如下:
来自:http://www.oschina.net/code/snippet_12_5808
http://blog.chinaunix.net/u/8780/showart.php?id=313714
http://www.phpweblog.net/LiveStar/archive/2008/03/31/3102.html
php:
默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
html:
http://www.phpweblog.net/LiveStar/archive/2008/03/31/3102.html
php:
<?php
$data = addslashes(fread(fopen($_FILES['userfile']['tmp_name'], "r"), filesize($_FILES['userfile']['tmp_name'])));
$data1 = fread(fopen($_FILES['userfile']['tmp_name'], "r"), filesize($_FILES['userfile']['tmp_name']));
$type = "image/pjpeg";
Header( "Content-type: $type");
echo $data1;//不能用$data由于用了函数 addslashes会显示不了图片的
?>
$data = addslashes(fread(fopen($_FILES['userfile']['tmp_name'], "r"), filesize($_FILES['userfile']['tmp_name'])));
$data1 = fread(fopen($_FILES['userfile']['tmp_name'], "r"), filesize($_FILES['userfile']['tmp_name']));
$type = "image/pjpeg";
Header( "Content-type: $type");
echo $data1;//不能用$data由于用了函数 addslashes会显示不了图片的
?>
默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
html:
<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="http://app.space.sina.com.cn/upload.php">
<label>
<input type="file" name="userfile" id="fileField" />
</label>
<label>
<input type="submit" name="button" id="button" value="upload" />
</label>
</form>
<label>
<input type="file" name="userfile" id="fileField" />
</label>
<label>
<input type="submit" name="button" id="button" value="upload" />
</label>
</form>
http://www.ibm.com/developerworks/cn/opensource/os-php-regex1/
首先,让我们看看两个特别的字符:’^’ 和 ‘$’ 他们是分别用来匹配字符串的开始和结束,一下分别举例说明:
"^The": 匹配以 "The"开头的字符串;
"of despair$": 匹配以 "of despair" 结尾的字符串;
"^abc$": 匹配以abc开头和以abc结尾的字符串,实际上是只有abc与之匹配;
"notice": 匹配包含notice的字符串;
你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边。
这里还有几个字符 '*', '+',和 '?', 他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:"zero or more", "one or more", and "zero or one." 这里是一些例子:
"ab*": 匹配字符串a和0个或者更多b组成的字符串("a", "ab", "abbb", etc.);
"ab+": 和上面一样,但最少有一个b ("ab", "abbb", etc.);
"ab?":匹配0个或者一个b;
"a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.
你也可以在大括号里面限制字符出现的个数,比如
"ab{2}": 匹配一个a后面跟两个b(一个也不能少)("abb");
"ab{2,}": 最少更两个b("abb", "abbbb", etc.);
"ab{3,5}": 2-5个b("abbb", "abbbb", or "abbbbb").
你还要注意到你必须总是指定 (i.e, "{0,2}", not "{,2}").同样,你必须注意到, '*', '+', 和'?' 分别和一下三个范围标注是一样的,"{0,}", "{1,}", 和 "{0,1}"。
现在把一定数量的字符放到小括号里,比如:
"a(bc)*": 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}": 一个到5个 "bc."
还有一个字符 '│', 相当于OR 操作:
"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有这样 - 多个(包括0个)a或b,后面跟一个c的字符串 的字符串;
一个点('.')可以代表所有的 单一字符:
"a.[0-9]": 一个a跟一个字符再跟一个数字的 (含有这样一个字符串的字符串将被匹配,以后省略此括号)
"^.{3}$": 以三个字符结尾.中括号括住的内容只匹配一个 单一的字符
"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);
"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样);
"^[a-zA-Z]": 匹配以字母开头的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗号在加一个数字或字母结尾的字符串
你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 (i.e., "%[^a-zA-Z]%" 匹配含有 两个百分号里面有一个非字母 的字符串).
为了能够解释,但"^.[$()│*+?{\"作为有特殊意义的字符的时候,你必须在这些字符面前加'', 还有在php3中你应该避免在模式的最前面使用\, 比如说,正则表达式 "(\$│?[0-9]+" 应该这样调用 ereg("(\\$│?[0-9]+", $str) (不知道php4是不是一样)
不要忘记在中括号里面的字符是这条规路的例外—在中括号里面, 所有的特殊字符,包括(''), 都将失去他们的特殊性质(i.e., "[*\+?{}.]"匹配含有这些字符的字符串). 还有,正如regx的手册告诉我们: "如果列表里含有 ']', 最好把它作为列表里的第一个字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点(i.e. [a-d-0-9]中间的‘-’将有效.
为了完整, 我应该涉及到 collating sequences, character classes, 同埋 equivalence classes. 但我在这些方面不想讲的太详细, 这些在下面的文章仲都不需要涉及到. 你们可以在regex man pages 那里得到更多消息.
如何构建一个模式来匹配 货币数量 的输入
好了,现在我们要用我们所学的来干一些有用的事:构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式: "10000.00" 和 "10,000.00",或者没有小数部分, "10000" and "10,000". 现在让我们开始构建这个匹配模式:
^[1-9][0-9]*$
这是所变量必须以非0的数字开头.但这也意味着 单一的 "0" 也不能通过测试. 以下是解决的方法:
^(0│[1-9][0-9]*)$
"只有0和不以0开头的数字与之匹配",我们也可以允许一个负号再数字之前:
^(0│-?[1-9][0-9]*)$
这就是: "0 或者 一个以0开头可能有一个负号在前面的数字." 好了, 好了现在让我们别那么严谨,允许以0开头.现在让我们放弃 负号 , 因为我们在表示钱币的时候并不需要用到. 我们现在指定 模式 用来匹配小数部分:
^[0-9]+(\.[0-9]+)?$
这暗示匹配的字符串必须最少以一个阿拉伯数字开头. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道为什么吗)
^[0-9]+(\.[0-9]{2})?$
我们上面指定小数点后面必须有两位小数.如果你认为这样太苛刻,你可以改成:
^[0-9]+(\.[0-9]{1,2})?$
这将允许小数点后面有一到两个字符. 现在我们加上用来增加可读性的逗号(每隔三位), 我们可以这样表示:
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
不要忘记加号 '+' 可以被乘号 '*' 替代如果你想允许空白字符串被输入话 (为什么?). 也不要忘记反斜杆 ’\’ 在php字符串中可能会出现错误 (很普遍的错误). 现在,我们已经可以确认字符串了, 我们现在把所有逗号都去掉 str_replace(",", "", $money) 然后在把类型看成 double然后我们就可以通过他做数学计算了.
构造检查email的正则表达式
让我们继续讨论怎么验证一个email地址. 在一个完整的email地址中有三个部分: POP3 用户名 (在 '@' 左边的一切), '@', 服务器名(就是剩下那部分). 用户名可以含有大小写字母阿拉伯数字,句号 ('.'), 减号('-'), and 下划线 ('_'). 服务器名字也是符合这个规则,当然下划线除外.
现在, 用户名的开始和结束都不能是句点. 服务器也是这样. 还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:
^[_a-zA-Z0-9-]+$
现在还不能允许句号的存在. 我们把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$
上面的意思就是说: "以至少一个规范字符(除.意外)开头,后面跟着0个或者多个以点开始的字符串."
简单化一点, 我们可以用 eregi()取代 ereg().eregi()对大小写不敏感, 我们就不需要指定两个范围 "a-z" 和 "A-Z" – 只需要指定一个就可以了:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
后面的服务器名字也是一样,但要去掉下划线:
^[a-z0-9-]+(\.[a-z0-9-]+)*$
Done. 现在只需要用”@”把两部分连接:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$
这就是完整的email认证匹配模式了,只需要调用
eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil)
就可以得到是否为email了。
正则表达式的其他用法
提取字符串
ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册). 比如说,我们想从 path/URL 提取文件名 – 下面的代码就是你需要:
ereg("([^\\/]*)$", $pathOrUrl, $regs);
echo $regs[1];
高级的代换
ereg_replace() 和 eregi_replace()也是非常有用的: 假如我们想把所有的间隔负号都替换成逗号:
ereg_replace("[ \n\r\t]+", ",", trim($str));
首先,让我们看看两个特别的字符:’^’ 和 ‘$’ 他们是分别用来匹配字符串的开始和结束,一下分别举例说明:
"^The": 匹配以 "The"开头的字符串;
"of despair$": 匹配以 "of despair" 结尾的字符串;
"^abc$": 匹配以abc开头和以abc结尾的字符串,实际上是只有abc与之匹配;
"notice": 匹配包含notice的字符串;
你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边。
这里还有几个字符 '*', '+',和 '?', 他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:"zero or more", "one or more", and "zero or one." 这里是一些例子:
"ab*": 匹配字符串a和0个或者更多b组成的字符串("a", "ab", "abbb", etc.);
"ab+": 和上面一样,但最少有一个b ("ab", "abbb", etc.);
"ab?":匹配0个或者一个b;
"a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.
你也可以在大括号里面限制字符出现的个数,比如
"ab{2}": 匹配一个a后面跟两个b(一个也不能少)("abb");
"ab{2,}": 最少更两个b("abb", "abbbb", etc.);
"ab{3,5}": 2-5个b("abbb", "abbbb", or "abbbbb").
你还要注意到你必须总是指定 (i.e, "{0,2}", not "{,2}").同样,你必须注意到, '*', '+', 和'?' 分别和一下三个范围标注是一样的,"{0,}", "{1,}", 和 "{0,1}"。
现在把一定数量的字符放到小括号里,比如:
"a(bc)*": 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}": 一个到5个 "bc."
还有一个字符 '│', 相当于OR 操作:
"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有这样 - 多个(包括0个)a或b,后面跟一个c的字符串 的字符串;
一个点('.')可以代表所有的 单一字符:
"a.[0-9]": 一个a跟一个字符再跟一个数字的 (含有这样一个字符串的字符串将被匹配,以后省略此括号)
"^.{3}$": 以三个字符结尾.中括号括住的内容只匹配一个 单一的字符
"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);
"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样);
"^[a-zA-Z]": 匹配以字母开头的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗号在加一个数字或字母结尾的字符串
你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 (i.e., "%[^a-zA-Z]%" 匹配含有 两个百分号里面有一个非字母 的字符串).
为了能够解释,但"^.[$()│*+?{\"作为有特殊意义的字符的时候,你必须在这些字符面前加'', 还有在php3中你应该避免在模式的最前面使用\, 比如说,正则表达式 "(\$│?[0-9]+" 应该这样调用 ereg("(\\$│?[0-9]+", $str) (不知道php4是不是一样)
不要忘记在中括号里面的字符是这条规路的例外—在中括号里面, 所有的特殊字符,包括(''), 都将失去他们的特殊性质(i.e., "[*\+?{}.]"匹配含有这些字符的字符串). 还有,正如regx的手册告诉我们: "如果列表里含有 ']', 最好把它作为列表里的第一个字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点(i.e. [a-d-0-9]中间的‘-’将有效.
为了完整, 我应该涉及到 collating sequences, character classes, 同埋 equivalence classes. 但我在这些方面不想讲的太详细, 这些在下面的文章仲都不需要涉及到. 你们可以在regex man pages 那里得到更多消息.
如何构建一个模式来匹配 货币数量 的输入
好了,现在我们要用我们所学的来干一些有用的事:构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式: "10000.00" 和 "10,000.00",或者没有小数部分, "10000" and "10,000". 现在让我们开始构建这个匹配模式:
^[1-9][0-9]*$
这是所变量必须以非0的数字开头.但这也意味着 单一的 "0" 也不能通过测试. 以下是解决的方法:
^(0│[1-9][0-9]*)$
"只有0和不以0开头的数字与之匹配",我们也可以允许一个负号再数字之前:
^(0│-?[1-9][0-9]*)$
这就是: "0 或者 一个以0开头可能有一个负号在前面的数字." 好了, 好了现在让我们别那么严谨,允许以0开头.现在让我们放弃 负号 , 因为我们在表示钱币的时候并不需要用到. 我们现在指定 模式 用来匹配小数部分:
^[0-9]+(\.[0-9]+)?$
这暗示匹配的字符串必须最少以一个阿拉伯数字开头. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道为什么吗)
^[0-9]+(\.[0-9]{2})?$
我们上面指定小数点后面必须有两位小数.如果你认为这样太苛刻,你可以改成:
^[0-9]+(\.[0-9]{1,2})?$
这将允许小数点后面有一到两个字符. 现在我们加上用来增加可读性的逗号(每隔三位), 我们可以这样表示:
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
不要忘记加号 '+' 可以被乘号 '*' 替代如果你想允许空白字符串被输入话 (为什么?). 也不要忘记反斜杆 ’\’ 在php字符串中可能会出现错误 (很普遍的错误). 现在,我们已经可以确认字符串了, 我们现在把所有逗号都去掉 str_replace(",", "", $money) 然后在把类型看成 double然后我们就可以通过他做数学计算了.
构造检查email的正则表达式
让我们继续讨论怎么验证一个email地址. 在一个完整的email地址中有三个部分: POP3 用户名 (在 '@' 左边的一切), '@', 服务器名(就是剩下那部分). 用户名可以含有大小写字母阿拉伯数字,句号 ('.'), 减号('-'), and 下划线 ('_'). 服务器名字也是符合这个规则,当然下划线除外.
现在, 用户名的开始和结束都不能是句点. 服务器也是这样. 还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:
^[_a-zA-Z0-9-]+$
现在还不能允许句号的存在. 我们把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$
上面的意思就是说: "以至少一个规范字符(除.意外)开头,后面跟着0个或者多个以点开始的字符串."
简单化一点, 我们可以用 eregi()取代 ereg().eregi()对大小写不敏感, 我们就不需要指定两个范围 "a-z" 和 "A-Z" – 只需要指定一个就可以了:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
后面的服务器名字也是一样,但要去掉下划线:
^[a-z0-9-]+(\.[a-z0-9-]+)*$
Done. 现在只需要用”@”把两部分连接:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$
这就是完整的email认证匹配模式了,只需要调用
eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil)
就可以得到是否为email了。
正则表达式的其他用法
提取字符串
ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册). 比如说,我们想从 path/URL 提取文件名 – 下面的代码就是你需要:
ereg("([^\\/]*)$", $pathOrUrl, $regs);
echo $regs[1];
高级的代换
ereg_replace() 和 eregi_replace()也是非常有用的: 假如我们想把所有的间隔负号都替换成逗号:
ereg_replace("[ \n\r\t]+", ",", trim($str));
<?php
$array = array();
if(empty($array)){
echo "我空了\n";
}
$array['array']='我是数组';
print_r($array);
?>
$array = array();
if(empty($array)){
echo "我空了\n";
}
$array['array']='我是数组';
print_r($array);
?>
最近装个了Freebsd7.0,不太会用.以前用过一点Linux和Solaris,昨天花了一天的时间来装上述软件,把一天的操作和心得整理一下,也许对像我一样的BSD新有点作用吧.
以前在Linux装上述软件时我是一个一个编译安装的,Solaris上是用pkgadd安装的Apache和MySQL,然后手动编译安装的PHP.
开始上网先搜索了一些关于配置这方面的资料,由于最近才玩BSD,对ports安装软件也不熟悉,况且我那台机器只能在内网使用,没有连接外网,也许所要安装的这些软件在光盘里有(我安装完系统后就把光盘放一边去了,太懒了),综合上述原因我决定下载上述软件的源码包一下一个的手动安装.
一、安装apache2.2.8
首先去http://www.apache.org网站上下载apache2.2.8源码包
解压缩
#tar zxvf httpd-2.2.8.tar.gz
得到 httpd-2.2.8文件夹
#cd httpd-2.2.8
配置
阅读全文
以前在Linux装上述软件时我是一个一个编译安装的,Solaris上是用pkgadd安装的Apache和MySQL,然后手动编译安装的PHP.
开始上网先搜索了一些关于配置这方面的资料,由于最近才玩BSD,对ports安装软件也不熟悉,况且我那台机器只能在内网使用,没有连接外网,也许所要安装的这些软件在光盘里有(我安装完系统后就把光盘放一边去了,太懒了),综合上述原因我决定下载上述软件的源码包一下一个的手动安装.
一、安装apache2.2.8
首先去http://www.apache.org网站上下载apache2.2.8源码包
解压缩
#tar zxvf httpd-2.2.8.tar.gz
得到 httpd-2.2.8文件夹
#cd httpd-2.2.8
配置
阅读全文
<?php
/*
form:1292275
to: 2000000
* */
error_reporting(E_ALL);
class snatch
{
var $db_host="10.210.128.197";
var $db_port="3600";
var $db_name="app4";
var $user="app4";
var $password="f40RB12cbE4a";
var $table="movie_info";
var $path="./";//扫描的目录位置
function _setvalue($path)
{
$this->path=$path;
}
function judge_return_info(&$all_film_info)//相当于日志和初始化的作用,同时检查数据是否合格和有漏补空,清NUll为空!
{//补全数据库空白字段,以防发生插入错误,和Null值的发上
$all_film_fild=array("0"=>"english_name","1"=>"chinese_name","2"=>"other_name","3"=>"playwright","4"=>"director","5"=>"main_performer","6"=>"play_year","7"=>"language","8"=>"country","9"=>"imdb","10"=>"introduce","11"=>"play_img","12"=>"tag");
foreach($all_film_fild as $keys=> $fileds)
{
if(!isset($all_film_info[$fileds]))//检查抓取的东西的数据库对应项键值是否都存在
{
$all_film_info[$fileds]="";
$empty_filds[]=$fileds;
}
if(is_array($all_film_info[$fileds]))
{
$all_film_info[$fileds]=serialize($all_film_info[$fileds]);
}
}
return $empty_filds;
}
function opendir_analyse_insert()
{
$dir = opendir($this->path);//取得dir目录列表
while (($file = readdir($dir)) !== false)//列出 images 目录中的文件
{
if(($file !=".")&&$file !="..")//防止.或者..
{
$all = $this->analyse($this->path,$file);//分析数据
$empty_filds = $this->judge_return_info($all);//取地址提高效率
$flag=$this->insert($all);//插入数据
if($flag)
{
echo "对文件 ".$file." 的分析完毕,发现 ".join(",",$empty_filds)." 等分析为空, 插入数据库成功!\n";
}else{
echo "对文件 ".$file." 的分析完毕,发现 ".join(",",$empty_filds)." 等分析为空, 插入数据库失败!\n";
}
//print_r($all);
}
}
closedir($dir);
}
function analyse($path,$file)// 分析返回要插入的资料,返回一个数组
{
$file_info=$path."/".$file;
$str_temp = file_get_contents($file_info);
$str_temp = str_replace("\n", "",$str_temp);
preg_match("/.*<span[^p]*pl2[^>]*>([^<]*)<\/span>/i", $str_temp, $out);
if($out==NULL)//假如是中文名称没有匹配到则把正常的<h1>***</h1>中的***为中文,特殊情况
{
preg_match("/<h1>[^<]*<\/h1>/i",$str_temp, $out5);
//去掉<h1></h1>
$str_temp1=strstr($out5[0],"<h1>");
$position = strpos($out5[0],"</h1>");
$real_postion=$position-4;
$film_all_info["chinese_name"]=substr($out5[0],4,$real_postion);//4就是<h1>长度
//print_r($out5);//英文名称
}else//匹配到中文后,中文是中文,英文是英文,以下分别做处理
{
//var_dump($out);
//print_r($out);//简体中文名 $out[1]
$chinese_name_all = explode(":",$out[1]);
$chinese_name=$chinese_name_all[1];
$film_all_info['chinese_name']=$chinese_name;
preg_match("/<h1>[^<]*<\/h1>/i",$str_temp, $out5);
//去掉<h1></h1>
$str_temp1=strstr($out5[0],"<h1>");
$position = strpos($out5[0],"</h1>");
$real_postion=$position-4;
$film_all_info["english_name"]=substr($out5[0],4,$real_postion);//4就是<h1>长度
//print_r($out5);//英文名称
}
$movie_filed=array("0"=>"编剧","1"=>"导演","2"=>"主演","3"=>"上映年度","4"=>"制片国家/地区","5"=>"又名","6"=>"imdb链接","7"=>"语言");
$dba_film_fild=array("0"=>"playwright","1"=>"director","2"=>"main_performer","3"=>"play_year","4"=>"country","5"=>"other_name","6"=>"imdb","7"=>"language");//每一个键值对应的电影名称通过 array_search()来对应
preg_match_all("/<span[^>]*pl\"[^>]*>(.*?)<\/span>(.*?)<br\/>/i",$str_temp, $out3);
//print_r($out3[1]);//导演,编剧主演等信息
//print_r($out3[2]);//导演,编剧主演等详细信息
//print_r($out3);
foreach($out3[1] as $key=>$value)
{
$trimmed = trim($value, ": <br>");//去掉又名的:
$trimmed = trim($trimmed, ":");//去掉其他的:
/*
$key = array_search("制片国家/地区",$movie_filed);
echo $key;
*/
$pos = array_search($trimmed,$movie_filed);//html中的其中一个元素和我们的movie_filed对照看是否在
if($pos != NULL)
{
//html中的一个元素在html数组中的键值key,自己定义的键值为pos
if(!empty($out3[2][$key]))
{
//echo $dba_film_fild[$pos]."==>".strip_tags($out3[2][$key])."<br>";
//数据库名称==>对应分析数据
if(strstr(strip_tags($out3[2][$key]),"/") != false)
{
$out3[2][$key] = trim($out3[2][$key], ":");//去掉最前面的:号
$out3[2][$key]=str_replace(array(":"),"",strip_tags($out3[2][$key]));
$film_all_info[$dba_film_fild[$pos]]=explode(" /",strip_tags($out3[2][$key]));
}else{
$film_all_info[$dba_film_fild[$pos]]=strip_tags($out3[2][$key]); //print_r($out3[2]);//导演,编剧主演等信息
}
}
//插入数据库字段对应$dba_film_fild[$key]
}
//对imdb单独处理,由正则取imdb码
$imdb_judge = strstr($value, 'imdb');
if($imdb_judge!=false)
{
$pat = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';//匹配超链接正则
preg_match_all($pat, $imdb_judge, $m);
$film_all_info["imdb"] = $m[4][0];
}
}
preg_match("/otho\.douban\.com\/mpic\/([^\"]*)\.jpg\"/i",$str_temp, $out4);
$film_all_info["play_img"]=$out4[1];
//print_r($out4);图片
preg_match("/<div class=\"related_info\">.*?<div class=\"indent\">(.*?)<br\/>/i",$str_temp, $out6);
$film_all_info["introduce"]=$out6[1];
//print_r($out6);//剧情简介
preg_match("/<div class=\"indent\"><a href=\"\/movie\/tag\/.+<div class=\"obss\">/i",$str_temp, $out7);
if(!empty($out7))//如果有标签不为空
{
$pat = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';//匹配超链接正则
preg_match_all($pat, $out7[0], $tag);
//echo $out7[0];//匹配标签
$film_all_info["tag"]=$tag[4];
//print_r($tag[4]);
//print_r($film_all_info);
}
return $film_all_info;
}
function insert($all_film_info)//插入数据库
{
$dsn="mysql:host=".$this->db_host.";port=".$this->db_port.";dbname=".$this->db_name;
$db = new PDO($dsn, $this->user, $this->password);
//print_r($all_film_info);
foreach($all_film_info as $key=>$values)
{
$fileds[]=$key;
$content[]="'".mysql_escape_string($values)."'";//以防相关的危害串mysql_escape_string
}
$filed_separated = join(",", $fileds);
$fild_content = join(",", $content);
$query="insert into `".$this->table."` (".$filed_separated.") values (".$fild_content.")";
$insert_flag = $db->exec($query);
if($insert_flag)
{
return 1;
}else{
return 0;
}
}
function judge_is_film($content)//判断是否是电影
{
$flag1 = strstr($content, "导演");
$flag2 = strstr($content, '编剧');
$flag3 = strstr($content, '上映年度');
$flag4 = strstr($content, '语言');
$flag4 = strstr($content, '剧情简介');
var_dump($flag1);
if($flag1==false)
{
return 0;
}
if($flag2==false)
{
return 0;
}
if($flag3==false)
{
return 0;
}
if($flag4==false)
{
return 0;
}
return 1;
}
}
?>
<?php
$path="/home/xiangdong2/snatch/test"; //test后面不能有/号
$snatch=new snatch();
$snatch->_setvalue($path);
$movie_info = $snatch->opendir_analyse_insert();
?>
/*
form:1292275
to: 2000000
* */
error_reporting(E_ALL);
class snatch
{
var $db_host="10.210.128.197";
var $db_port="3600";
var $db_name="app4";
var $user="app4";
var $password="f40RB12cbE4a";
var $table="movie_info";
var $path="./";//扫描的目录位置
function _setvalue($path)
{
$this->path=$path;
}
function judge_return_info(&$all_film_info)//相当于日志和初始化的作用,同时检查数据是否合格和有漏补空,清NUll为空!
{//补全数据库空白字段,以防发生插入错误,和Null值的发上
$all_film_fild=array("0"=>"english_name","1"=>"chinese_name","2"=>"other_name","3"=>"playwright","4"=>"director","5"=>"main_performer","6"=>"play_year","7"=>"language","8"=>"country","9"=>"imdb","10"=>"introduce","11"=>"play_img","12"=>"tag");
foreach($all_film_fild as $keys=> $fileds)
{
if(!isset($all_film_info[$fileds]))//检查抓取的东西的数据库对应项键值是否都存在
{
$all_film_info[$fileds]="";
$empty_filds[]=$fileds;
}
if(is_array($all_film_info[$fileds]))
{
$all_film_info[$fileds]=serialize($all_film_info[$fileds]);
}
}
return $empty_filds;
}
function opendir_analyse_insert()
{
$dir = opendir($this->path);//取得dir目录列表
while (($file = readdir($dir)) !== false)//列出 images 目录中的文件
{
if(($file !=".")&&$file !="..")//防止.或者..
{
$all = $this->analyse($this->path,$file);//分析数据
$empty_filds = $this->judge_return_info($all);//取地址提高效率
$flag=$this->insert($all);//插入数据
if($flag)
{
echo "对文件 ".$file." 的分析完毕,发现 ".join(",",$empty_filds)." 等分析为空, 插入数据库成功!\n";
}else{
echo "对文件 ".$file." 的分析完毕,发现 ".join(",",$empty_filds)." 等分析为空, 插入数据库失败!\n";
}
//print_r($all);
}
}
closedir($dir);
}
function analyse($path,$file)// 分析返回要插入的资料,返回一个数组
{
$file_info=$path."/".$file;
$str_temp = file_get_contents($file_info);
$str_temp = str_replace("\n", "",$str_temp);
preg_match("/.*<span[^p]*pl2[^>]*>([^<]*)<\/span>/i", $str_temp, $out);
if($out==NULL)//假如是中文名称没有匹配到则把正常的<h1>***</h1>中的***为中文,特殊情况
{
preg_match("/<h1>[^<]*<\/h1>/i",$str_temp, $out5);
//去掉<h1></h1>
$str_temp1=strstr($out5[0],"<h1>");
$position = strpos($out5[0],"</h1>");
$real_postion=$position-4;
$film_all_info["chinese_name"]=substr($out5[0],4,$real_postion);//4就是<h1>长度
//print_r($out5);//英文名称
}else//匹配到中文后,中文是中文,英文是英文,以下分别做处理
{
//var_dump($out);
//print_r($out);//简体中文名 $out[1]
$chinese_name_all = explode(":",$out[1]);
$chinese_name=$chinese_name_all[1];
$film_all_info['chinese_name']=$chinese_name;
preg_match("/<h1>[^<]*<\/h1>/i",$str_temp, $out5);
//去掉<h1></h1>
$str_temp1=strstr($out5[0],"<h1>");
$position = strpos($out5[0],"</h1>");
$real_postion=$position-4;
$film_all_info["english_name"]=substr($out5[0],4,$real_postion);//4就是<h1>长度
//print_r($out5);//英文名称
}
$movie_filed=array("0"=>"编剧","1"=>"导演","2"=>"主演","3"=>"上映年度","4"=>"制片国家/地区","5"=>"又名","6"=>"imdb链接","7"=>"语言");
$dba_film_fild=array("0"=>"playwright","1"=>"director","2"=>"main_performer","3"=>"play_year","4"=>"country","5"=>"other_name","6"=>"imdb","7"=>"language");//每一个键值对应的电影名称通过 array_search()来对应
preg_match_all("/<span[^>]*pl\"[^>]*>(.*?)<\/span>(.*?)<br\/>/i",$str_temp, $out3);
//print_r($out3[1]);//导演,编剧主演等信息
//print_r($out3[2]);//导演,编剧主演等详细信息
//print_r($out3);
foreach($out3[1] as $key=>$value)
{
$trimmed = trim($value, ": <br>");//去掉又名的:
$trimmed = trim($trimmed, ":");//去掉其他的:
/*
$key = array_search("制片国家/地区",$movie_filed);
echo $key;
*/
$pos = array_search($trimmed,$movie_filed);//html中的其中一个元素和我们的movie_filed对照看是否在
if($pos != NULL)
{
//html中的一个元素在html数组中的键值key,自己定义的键值为pos
if(!empty($out3[2][$key]))
{
//echo $dba_film_fild[$pos]."==>".strip_tags($out3[2][$key])."<br>";
//数据库名称==>对应分析数据
if(strstr(strip_tags($out3[2][$key]),"/") != false)
{
$out3[2][$key] = trim($out3[2][$key], ":");//去掉最前面的:号
$out3[2][$key]=str_replace(array(":"),"",strip_tags($out3[2][$key]));
$film_all_info[$dba_film_fild[$pos]]=explode(" /",strip_tags($out3[2][$key]));
}else{
$film_all_info[$dba_film_fild[$pos]]=strip_tags($out3[2][$key]); //print_r($out3[2]);//导演,编剧主演等信息
}
}
//插入数据库字段对应$dba_film_fild[$key]
}
//对imdb单独处理,由正则取imdb码
$imdb_judge = strstr($value, 'imdb');
if($imdb_judge!=false)
{
$pat = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';//匹配超链接正则
preg_match_all($pat, $imdb_judge, $m);
$film_all_info["imdb"] = $m[4][0];
}
}
preg_match("/otho\.douban\.com\/mpic\/([^\"]*)\.jpg\"/i",$str_temp, $out4);
$film_all_info["play_img"]=$out4[1];
//print_r($out4);图片
preg_match("/<div class=\"related_info\">.*?<div class=\"indent\">(.*?)<br\/>/i",$str_temp, $out6);
$film_all_info["introduce"]=$out6[1];
//print_r($out6);//剧情简介
preg_match("/<div class=\"indent\"><a href=\"\/movie\/tag\/.+<div class=\"obss\">/i",$str_temp, $out7);
if(!empty($out7))//如果有标签不为空
{
$pat = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';//匹配超链接正则
preg_match_all($pat, $out7[0], $tag);
//echo $out7[0];//匹配标签
$film_all_info["tag"]=$tag[4];
//print_r($tag[4]);
//print_r($film_all_info);
}
return $film_all_info;
}
function insert($all_film_info)//插入数据库
{
$dsn="mysql:host=".$this->db_host.";port=".$this->db_port.";dbname=".$this->db_name;
$db = new PDO($dsn, $this->user, $this->password);
//print_r($all_film_info);
foreach($all_film_info as $key=>$values)
{
$fileds[]=$key;
$content[]="'".mysql_escape_string($values)."'";//以防相关的危害串mysql_escape_string
}
$filed_separated = join(",", $fileds);
$fild_content = join(",", $content);
$query="insert into `".$this->table."` (".$filed_separated.") values (".$fild_content.")";
$insert_flag = $db->exec($query);
if($insert_flag)
{
return 1;
}else{
return 0;
}
}
function judge_is_film($content)//判断是否是电影
{
$flag1 = strstr($content, "导演");
$flag2 = strstr($content, '编剧');
$flag3 = strstr($content, '上映年度');
$flag4 = strstr($content, '语言');
$flag4 = strstr($content, '剧情简介');
var_dump($flag1);
if($flag1==false)
{
return 0;
}
if($flag2==false)
{
return 0;
}
if($flag3==false)
{
return 0;
}
if($flag4==false)
{
return 0;
}
return 1;
}
}
?>
<?php
$path="/home/xiangdong2/snatch/test"; //test后面不能有/号
$snatch=new snatch();
$snatch->_setvalue($path);
$movie_info = $snatch->opendir_analyse_insert();
?>
有这么一段HTML,比较不规则的,如果要提取其中的链接地址和链接名称,怎么弄?
//HTML
$str = '<a id="top8" href="http://list.mp3.baidu.com/song/A.htm?top8" class="p14" target="_top">歌曲列表</a><br><a target="_blank" id="bp" href="http://list.mp3.baidu.com/list/bangping.html" class="p14">中文金曲榜</a><br><td nowrap="nowrap">• <a id="top19" href="qingyinyue.html?top19" class="p14" target="_top">轻音乐</a></td>';
利用正则表达式是最简单的,其它的办法,偶米去想。。。
$pat = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';
preg_match_all($pat, $str, $m);
输出方法:
print_r($m[2]);
print_r($m[4]);
或者:
for($i=0;$i<count($m[2]) ;$i++ ){
echo '<li><a href="'.$_SERVER['PHP_SELF'].'?url='.$m[2][$i].'">'.$m[4][$i].'</a>';
}
显示结果是:
Array ( [0] => http://list.mp3.baidu.com/song/A.htm?top8 [1] => http://list.mp3.baidu.com/list/bangping.html [2] => qingyinyue.html?top19 ) Array ( [0] => 歌曲列表 [1] => 中文金曲榜 [2] => 轻音乐 )
于是,我们要采集某个网站的标题及链接地址方法就出来了。。。自己套用吧。。。
//HTML
$str = '<a id="top8" href="http://list.mp3.baidu.com/song/A.htm?top8" class="p14" target="_top">歌曲列表</a><br><a target="_blank" id="bp" href="http://list.mp3.baidu.com/list/bangping.html" class="p14">中文金曲榜</a><br><td nowrap="nowrap">• <a id="top19" href="qingyinyue.html?top19" class="p14" target="_top">轻音乐</a></td>';
利用正则表达式是最简单的,其它的办法,偶米去想。。。
$pat = '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';
preg_match_all($pat, $str, $m);
输出方法:
print_r($m[2]);
print_r($m[4]);
或者:
for($i=0;$i<count($m[2]) ;$i++ ){
echo '<li><a href="'.$_SERVER['PHP_SELF'].'?url='.$m[2][$i].'">'.$m[4][$i].'</a>';
}
显示结果是:
Array ( [0] => http://list.mp3.baidu.com/song/A.htm?top8 [1] => http://list.mp3.baidu.com/list/bangping.html [2] => qingyinyue.html?top19 ) Array ( [0] => 歌曲列表 [1] => 中文金曲榜 [2] => 轻音乐 )
于是,我们要采集某个网站的标题及链接地址方法就出来了。。。自己套用吧。。。
$strip_tags($out3[2][$key]=str_replace(array(":"),"",strip_tags($out3[2][$key]);//将strip_tags($out3[2][$key]中的:替换为空!
接上文 Regular Expression 排除字符串 不包含字符串 ,连夜上传了一个用于测试正则表达式的工具,可以方便地设置测试用例,还可以一步一步引导你如何写一个有效的正则:
Regex Buddy 2.01 破解版
实在不好意思,我这里也是破解版,正版买不起,咱又不是用作商业用途,自己学习用,大家就不要鄙视我了,谢谢!
strip_tags
strtolower
ereg
eregi_replace
$content=strtolower($content); 转为小写
strtolower
ereg
eregi_replace
$content=strtolower($content); 转为小写
1、进入单用户模式
BOOT: /kernel -s
就进了单用户了, 然后/sbin/mount -rw /把/设置成可写
然后 vipw把root口令置空
2、开机自动fsck硬盘
fsck_y_enable="YES"
3、FreeBSD弹出光驱
cdcontol->Eject
4、OpenBSD弹出光驱
eject /dev/rcd0c
5、BSD下增加帐号
pw useradd hanyang -g wheel -s /usr/local/bin/bash阅读全文
BOOT: /kernel -s
就进了单用户了, 然后/sbin/mount -rw /把/设置成可写
然后 vipw把root口令置空
2、开机自动fsck硬盘
fsck_y_enable="YES"
3、FreeBSD弹出光驱
cdcontol->Eject
4、OpenBSD弹出光驱
eject /dev/rcd0c
5、BSD下增加帐号
pw useradd hanyang -g wheel -s /usr/local/bin/bash阅读全文
-f file 文件为正规文件为真
-s file 文件大小非0时为真 -s file true if the file has nonzero size
#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
#这里的-d 参数判断$myPath是否存在
#这里的-f参数判断$myFile是否存在
#其他参数还有-n,-n是判断一个变量是否是否有值
#两个变量判断是否相等
-s file 文件大小非0时为真 -s file true if the file has nonzero size
#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi
mkdir "$myPath"
fi
#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi
mkdir "$myPath"
fi
#这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi
touch "$myFile"
fi
#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi
echo "$myVar is empty"
exit 0
fi
#两个变量判断是否相等
if [ "$var1" == "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
请教问题了,在nginx下用以下命令,为什么不能把css里定义的背景图片下载下来?
回忆未来(372647693) 15:15:40
;wget不会分析这玩意吧。
喻恒春<achun.shx@qq.com> 15:16:04
wget可以整站下载,应该可以分析的
system("./website.sh http://".$row['url']."/ ".$row['url'], $result);
但是我在apache的服务器都可以把css里面的背景图片下载下来
换到nginx下就不行了,同样的命令
dominicli(李儒智) 19:59:09
谁知道怎么用wget拉一个目录下的所有文件吗?
wget -r -np -nd http://example.com/packages/
这条命令可以下载 http://example.com 网站上 packages 目录中的所有文件。
其中,-np 的作用是不遍历父目录,-nd 表示不在本机重新创建目录结构。-r, –recursive 递归下载--慎用!同时:目录要支持 Browsing wget 才能工作,这个要服务器支持才行的。
阅读全文
回忆未来(372647693) 15:15:40
;wget不会分析这玩意吧。
喻恒春<achun.shx@qq.com> 15:16:04
wget可以整站下载,应该可以分析的
system("./website.sh http://".$row['url']."/ ".$row['url'], $result);
但是我在apache的服务器都可以把css里面的背景图片下载下来
换到nginx下就不行了,同样的命令
dominicli(李儒智) 19:59:09
谁知道怎么用wget拉一个目录下的所有文件吗?
wget -r -np -nd http://example.com/packages/
这条命令可以下载 http://example.com 网站上 packages 目录中的所有文件。
其中,-np 的作用是不遍历父目录,-nd 表示不在本机重新创建目录结构。-r, –recursive 递归下载--慎用!同时:目录要支持 Browsing wget 才能工作,这个要服务器支持才行的。
阅读全文