问题提出:为何多线程? 答:为了问题得到有效解决.
什么问题:由于rpc僵死,ps aux|gep rpc rpc进程还在,但是它已经死掉失效了,但系统也无法知道,我们只好去调用rpc里面的一个函数看返回结果。
问:为何不用一个进程去判断而要用多线程?
答:一个进程掉用rpc里面的一个函数,在rpc死后如果调用,调用者无法退出终端,也死在那儿了.
问:为何不用多进程?
答:多进程不太熟悉,尝试失败。
最后:选择了多线程。。。
多线程的大致流程:
一个线程睡觉,一个干事情,干不动事情,睡觉的线程杀了干事情的线程。。。^_^(有趣)
shell如,一行搞定:
shell字符串相连:
c程序:阅读全文
什么问题:由于rpc僵死,ps aux|gep rpc rpc进程还在,但是它已经死掉失效了,但系统也无法知道,我们只好去调用rpc里面的一个函数看返回结果。
问:为何不用一个进程去判断而要用多线程?
答:一个进程掉用rpc里面的一个函数,在rpc死后如果调用,调用者无法退出终端,也死在那儿了.
问:为何不用多进程?
答:多进程不太熟悉,尝试失败。
最后:选择了多线程。。。
多线程的大致流程:
一个线程睡觉,一个干事情,干不动事情,睡觉的线程杀了干事情的线程。。。^_^(有趣)
#!/bin/sh
state=`/usr/local/bin/test_rpc_server_62 afeng@afeng.sina.net`;
if [ "$state" != "OK" ]; then
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
if [ -e /usr/local/etc/rc.d/entplatform_rpcserver.sh ]; then
sh /usr/local/etc/rc.d/entplatform_rpcserver.sh
else
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
cat /etc/rc.local |grep rpc |sh
fi
echo "rpc bad, restart.";
else
echo "rpc ok.";
fi
state=`/usr/local/bin/test_rpc_server_62 afeng@afeng.sina.net`;
if [ "$state" != "OK" ]; then
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
if [ -e /usr/local/etc/rc.d/entplatform_rpcserver.sh ]; then
sh /usr/local/etc/rc.d/entplatform_rpcserver.sh
else
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
cat /etc/rc.local |grep rpc |sh
fi
echo "rpc bad, restart.";
else
echo "rpc ok.";
fi
shell如,一行搞定:
grep '|'`date +20%y-%m-%d`' ALL FUNISHED! |' /data0/daemon_log/popularity/addScoreOnline.log >> /data0/daemon_log/popularity/addScoreOnlineSh.log
shell字符串相连:
A=EDIT
N=1
B=$A$N
echo $B
N=1
B=$A$N
echo $B
c程序:阅读全文
http://www.robotsky.com/KongZhi/QianRS/2008-03-05/12047239162248.html
新劳动法:不再有违约金束缚
举例:
李新是北京某高校2005年的毕业生。毕业前,老师为品学兼优的他介绍了一家国有企业,虽然待遇不高,但可以解决户口,前提是必须签五年。为了落户,李新毫不犹豫地签了约。但不久一家外企又给他抛来了橄榄枝。两相比较,李新决定辞掉国企进外企。但那家国企却认为李新违约,除非他支付5万块的违约金,否则就不给办退档手续。经过学校老师多方协商,最终李新交了2万块钱违约金才取回自己的档案。
《劳动合同法》第二十二条 劳动者违反服务期约定的,应当按照约定向用人单位支付违约金。违约金的数额不得超过用人单位提供的培训费用。用人单位要求劳动者支付的违约金不得超过服务期尚未履行部分所应分摊的培训费用。用人单位与劳动者约定服务期的,不影响按照正常的工资调整机制提高劳动者在服务期期间的劳动报酬。
《劳动合同法》第二十三条 用人单位与劳动者可以在劳动合同中约定保守用人单位的商业秘密和与知识产权相关的保密事项。劳动者违反竞业限制约定的,应当按照约定向用人单位支付违约金。
《劳动合同法》第二十五条 除本法第二十二条和第二十三条规定的情形外,用人单位不得与劳动者约定由劳动者承担违约金。
解读:违约金一向是用人单位绑住劳动者的“紧箍咒”但明年1月1日之后,想炒老板鱿鱼的打工仔可以“挥挥衣袖不留下一分血汗钱”了。除非劳动者接受过单位的培训,或有保密协议和竞业限制的协议,劳动者不需向单位支付任何违约金,而且单位必须出具第三方开的培训费用发票才能证明对劳动者进行过培训,企业内部培训或没有第三方发票的都不算。
本人曾经考过清华的法律研究生,请问:我是在新劳动法之前签的合同,会不会因为法律没有溯及力而合同任然需要缴纳违约金呢?
答:新劳动合同法附则中有一条:第九十七条 本法施行前已依法订立且在本法施行之日存续的劳动合同,继续履行;
也就是从旧法了?
徐俊东 17:29:43
若你的合同中已经有明确的关于违约金的规定是有法律效力的.
徐俊东 17:30:36
若没有明确规定违约金,可以适用新法.
徐俊东 17:30:48
先去吃饭了
很傻很天真 17:30:51
规定了,金额都写清楚了,也就是还是按照旧的该交违约金得交,对吧?
徐俊东 17:30:59
恩
徐俊东 2008-10-6 21:01:13
用人单位与劳动者约定了服务期,劳动者依照劳动合同法第三十八条的规定解除劳动合同的,不属于违反服务期的约定,用人单位不得要求劳动者支付违约金。
徐俊东 2008-10-6 21:01:40
第二十六条用人单位与劳动者约定了服务期,劳动者依照劳动合同法第三十八条的规定解除劳动合同的,不属于违反服务期的约定,用人单位不得要求劳动者支付违约金。 有下列情形之一,用人单位与劳动者解除约定服务期的劳动合同的,劳动者应当按照劳动合同的约定向用人单位支付违约金: (一)劳动者严重违反用人单位的规章制度的; (二)劳动者严重失职,营私舞弊,给用人单位造成重大损害的; (三)劳动者同时与其他用人单位建立劳动关系,对完成本单位的工作任务造成严重影响,或者经用人单位提出,拒不改正的; (四)劳动者以欺诈、胁迫的手段或者乘人之危,使用人单位在违背真实意思的情况下订立或者变更劳动合同的; (五)劳动者被依法追究刑事责任的。
徐俊东 2008-10-6 21:02:37
劳动合同法 第三十八条 用人单位有下列情形之一的,劳动者可以解除劳动合同:
(一)未按照劳动合同约定提供劳动保护或者劳动条件的;
(二)未及时足额支付劳动报酬的;
(三)未依法为劳动者缴纳社会保险费的;
(四)用人单位的规章制度违反法律、法规的规定,损害劳动者权益的;
(五)因本法第二十六条第一款规定的情形致使劳动合同无效的;
(六)法律、行政法规规定劳动者可以解除劳动合同的其他情形。
用人单位以暴力、威胁或者非法限制人身自由的手段强迫劳动者劳动的,或者用人单位违章指挥、强令冒险作业危及劳动者人身安全的,劳动者可以立即解除劳动合同,不需事先告知用人单位。
举例:
李新是北京某高校2005年的毕业生。毕业前,老师为品学兼优的他介绍了一家国有企业,虽然待遇不高,但可以解决户口,前提是必须签五年。为了落户,李新毫不犹豫地签了约。但不久一家外企又给他抛来了橄榄枝。两相比较,李新决定辞掉国企进外企。但那家国企却认为李新违约,除非他支付5万块的违约金,否则就不给办退档手续。经过学校老师多方协商,最终李新交了2万块钱违约金才取回自己的档案。
《劳动合同法》第二十二条 劳动者违反服务期约定的,应当按照约定向用人单位支付违约金。违约金的数额不得超过用人单位提供的培训费用。用人单位要求劳动者支付的违约金不得超过服务期尚未履行部分所应分摊的培训费用。用人单位与劳动者约定服务期的,不影响按照正常的工资调整机制提高劳动者在服务期期间的劳动报酬。
《劳动合同法》第二十三条 用人单位与劳动者可以在劳动合同中约定保守用人单位的商业秘密和与知识产权相关的保密事项。劳动者违反竞业限制约定的,应当按照约定向用人单位支付违约金。
《劳动合同法》第二十五条 除本法第二十二条和第二十三条规定的情形外,用人单位不得与劳动者约定由劳动者承担违约金。
解读:违约金一向是用人单位绑住劳动者的“紧箍咒”但明年1月1日之后,想炒老板鱿鱼的打工仔可以“挥挥衣袖不留下一分血汗钱”了。除非劳动者接受过单位的培训,或有保密协议和竞业限制的协议,劳动者不需向单位支付任何违约金,而且单位必须出具第三方开的培训费用发票才能证明对劳动者进行过培训,企业内部培训或没有第三方发票的都不算。
本人曾经考过清华的法律研究生,请问:我是在新劳动法之前签的合同,会不会因为法律没有溯及力而合同任然需要缴纳违约金呢?
答:新劳动合同法附则中有一条:第九十七条 本法施行前已依法订立且在本法施行之日存续的劳动合同,继续履行;
也就是从旧法了?
徐俊东 17:29:43
若你的合同中已经有明确的关于违约金的规定是有法律效力的.
徐俊东 17:30:36
若没有明确规定违约金,可以适用新法.
徐俊东 17:30:48
先去吃饭了
很傻很天真 17:30:51
规定了,金额都写清楚了,也就是还是按照旧的该交违约金得交,对吧?
徐俊东 17:30:59
恩
徐俊东 2008-10-6 21:01:13
用人单位与劳动者约定了服务期,劳动者依照劳动合同法第三十八条的规定解除劳动合同的,不属于违反服务期的约定,用人单位不得要求劳动者支付违约金。
徐俊东 2008-10-6 21:01:40
第二十六条用人单位与劳动者约定了服务期,劳动者依照劳动合同法第三十八条的规定解除劳动合同的,不属于违反服务期的约定,用人单位不得要求劳动者支付违约金。 有下列情形之一,用人单位与劳动者解除约定服务期的劳动合同的,劳动者应当按照劳动合同的约定向用人单位支付违约金: (一)劳动者严重违反用人单位的规章制度的; (二)劳动者严重失职,营私舞弊,给用人单位造成重大损害的; (三)劳动者同时与其他用人单位建立劳动关系,对完成本单位的工作任务造成严重影响,或者经用人单位提出,拒不改正的; (四)劳动者以欺诈、胁迫的手段或者乘人之危,使用人单位在违背真实意思的情况下订立或者变更劳动合同的; (五)劳动者被依法追究刑事责任的。
徐俊东 2008-10-6 21:02:37
劳动合同法 第三十八条 用人单位有下列情形之一的,劳动者可以解除劳动合同:
(一)未按照劳动合同约定提供劳动保护或者劳动条件的;
(二)未及时足额支付劳动报酬的;
(三)未依法为劳动者缴纳社会保险费的;
(四)用人单位的规章制度违反法律、法规的规定,损害劳动者权益的;
(五)因本法第二十六条第一款规定的情形致使劳动合同无效的;
(六)法律、行政法规规定劳动者可以解除劳动合同的其他情形。
用人单位以暴力、威胁或者非法限制人身自由的手段强迫劳动者劳动的,或者用人单位违章指挥、强令冒险作业危及劳动者人身安全的,劳动者可以立即解除劳动合同,不需事先告知用人单位。
本人現在17歲了,喉嚨裏面很紅,也不是喉嚨,就是在嘴巴裏面,別人看進去很紅,早上起來感覺嘴巴裏面很痛,喝過開水就不痛了,但是紅紅的沒有退去,這要不要去看醫生呢,已經5天左右了,會不會痛的越來越厲害?
第一次問題補充:(2007-7-23 11:38:11)這不是是什麼大病啊,我以前都沒這樣過的,不知道最近才這樣痛的,就只有早是剛起來的時候才感覺嘴巴裏面很痛的
首先你要去除诱因,少吃辣椒、羊肉、大葱等辛辣刺激食物(一般复发或难治和这些因素有关)。多喝水。送你一方你坚持喝一段时间可能效果不错(很多人说还比较管用,但服用时间较长)
玄参15克沙参15克山豆根15克木蝴蝶9克麦冬15克金银花15克生地15克桔梗15克平均分成三份,每天一份泡水当茶喝。先喝10天看看效果如何
如果现在难受的厉害就配合服用知柏地黄丸每晚两丸,淡盐水送下,滋阴补肾。
我是一个慢性咽炎患者,根据我多年的经验,我总结出以下几点,治咽炎的办法
第一:要相信这病肯定能好的,要有信心
第二:该戒的东西要戒,戒不掉也要有限量,酒、烟、辣椒、可乐、桔子等等燥热和刺激性的东西。
第三:也是最重要的一点,要随时保持愉快的心情,千万别发火更不能和别人吵架。
第四:药还是要吃的,尽量吃中药来调养,我个人推荐菌针冲剂,这是一个乡下老医生自己研制的中药,个人觉得挺不错的
咽部感染的治疗.主要是要少说话、少量多次喝水,血WBC(白细胞)不高,不要使用抗生素,尽量使用含化片如西瓜霜等,并且禁忌辛辣硬食物、烟酒
第一次問題補充:(2007-7-23 11:38:11)這不是是什麼大病啊,我以前都沒這樣過的,不知道最近才這樣痛的,就只有早是剛起來的時候才感覺嘴巴裏面很痛的
首先你要去除诱因,少吃辣椒、羊肉、大葱等辛辣刺激食物(一般复发或难治和这些因素有关)。多喝水。送你一方你坚持喝一段时间可能效果不错(很多人说还比较管用,但服用时间较长)
玄参15克沙参15克山豆根15克木蝴蝶9克麦冬15克金银花15克生地15克桔梗15克平均分成三份,每天一份泡水当茶喝。先喝10天看看效果如何
如果现在难受的厉害就配合服用知柏地黄丸每晚两丸,淡盐水送下,滋阴补肾。
我是一个慢性咽炎患者,根据我多年的经验,我总结出以下几点,治咽炎的办法
第一:要相信这病肯定能好的,要有信心
第二:该戒的东西要戒,戒不掉也要有限量,酒、烟、辣椒、可乐、桔子等等燥热和刺激性的东西。
第三:也是最重要的一点,要随时保持愉快的心情,千万别发火更不能和别人吵架。
第四:药还是要吃的,尽量吃中药来调养,我个人推荐菌针冲剂,这是一个乡下老医生自己研制的中药,个人觉得挺不错的
咽部感染的治疗.主要是要少说话、少量多次喝水,血WBC(白细胞)不高,不要使用抗生素,尽量使用含化片如西瓜霜等,并且禁忌辛辣硬食物、烟酒
如果你已经过了20岁但还不到25岁的话,你必须找到除了爱情之外,能够使你用双脚坚强站在大地上的东西。你要找到谋生的方式。现在考虑不晚了。
我从来不以为学历有什么重要,天才都不是科班,但,不是科班,连龙套都跑不了。你必须把那些浮如飘絮的思绪,渐渐转化为清晰的思路和简单的文字。华丽和漂浮都不易长久。你要知道,给予文字阅读快感不够的,内容,思想,境界,灵魂,精神和智慧,这些才重要。不要多看那些和你一个路数的女作家的文字。不要琐碎,无病呻吟。不要想到什么就写。不要流连于小感伤和小感动。
我要你相信温暖,美好,信任,尊严,坚强这些老掉牙的字眼。我不要你颓废,空虚,迷茫,糟践自己,伤害别人。我不要你把自己处理得一团糟。节制自己的感情并且珍惜它,明白这种感情不是任何人都能要。体验生活,是另外一回事,并不意味着堕落和放纵。千万不要认同那些伪装的酷和另类。他们是无事可做的人找出来放任自己无事可做的借口,真正的酷是在内心。你要有强大的内心。要有任凭时间流逝,不会磨折和屈服的信念。不是因为在学校的象牙塔中,才说出我爱世界这样的话,是知道外面的黑,脏,丑陋之后,还要说出这样的话。好好去爱,去生活。青春如此短暂,不要叹老。偶尔可以停下来休息,但是别蹲下来张望。走了一条路的时候,记得别回头看。时不时问问自己,自己在干嘛?阅读全文
我从来不以为学历有什么重要,天才都不是科班,但,不是科班,连龙套都跑不了。你必须把那些浮如飘絮的思绪,渐渐转化为清晰的思路和简单的文字。华丽和漂浮都不易长久。你要知道,给予文字阅读快感不够的,内容,思想,境界,灵魂,精神和智慧,这些才重要。不要多看那些和你一个路数的女作家的文字。不要琐碎,无病呻吟。不要想到什么就写。不要流连于小感伤和小感动。
我要你相信温暖,美好,信任,尊严,坚强这些老掉牙的字眼。我不要你颓废,空虚,迷茫,糟践自己,伤害别人。我不要你把自己处理得一团糟。节制自己的感情并且珍惜它,明白这种感情不是任何人都能要。体验生活,是另外一回事,并不意味着堕落和放纵。千万不要认同那些伪装的酷和另类。他们是无事可做的人找出来放任自己无事可做的借口,真正的酷是在内心。你要有强大的内心。要有任凭时间流逝,不会磨折和屈服的信念。不是因为在学校的象牙塔中,才说出我爱世界这样的话,是知道外面的黑,脏,丑陋之后,还要说出这样的话。好好去爱,去生活。青春如此短暂,不要叹老。偶尔可以停下来休息,但是别蹲下来张望。走了一条路的时候,记得别回头看。时不时问问自己,自己在干嘛?阅读全文
http://www.ibm.com/developerworks/cn/opensource/os-php-apachesolr/
http://www.ibm.com/developerworks/cn/web/wa-lucene2/?ca=wa-t10
http://www.ibm.com/developerworks/cn/edu/os-dw-os-apachelucene.html
http://www.ibm.com/developerworks/cn/web/wa-lucene2/?ca=wa-t10
http://www.ibm.com/developerworks/cn/edu/os-dw-os-apachelucene.html
登陆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] => 轻音乐 )
于是,我们要采集某个网站的标题及链接地址方法就出来了。。。自己套用吧。。。