在WINDOWS7系统下,使用以前Xp的快捷键win+u+u关机不行了?告诉你个新方法,操作键数和次数一样,好用的要尖叫。
更高明的办法:win + -> +回车!这个办法和XP一样,只需要3次操作!
更高明的办法:win + -> +回车!这个办法和XP一样,只需要3次操作!
[实践Ok]开机自动启动samba
Unix/LinuxC技术 jackxiang 2012-8-18 18:28
service nmb start
service nscd start
1. 在 /etc/init.d 中作一个如下内容的脚本smbd
一般要封装一下:
2. 然后执行
ln -s /etc/init.d/smbd /etc/rc3.d/S99smbd
ln -s /etc/init.d/smbd /etc/rc0.d/K01smbd
3.测试一下及赋权限:
开机启动:
service smbd start
env: /etc/init.d/smbd: 权限不够
chmod -R a+x /etc/init.d/smbd
service nscd start
1. 在 /etc/init.d 中作一个如下内容的脚本smbd
一般要封装一下:
2. 然后执行
ln -s /etc/init.d/smbd /etc/rc3.d/S99smbd
ln -s /etc/init.d/smbd /etc/rc0.d/K01smbd
3.测试一下及赋权限:
开机启动:
service smbd start
env: /etc/init.d/smbd: 权限不够
chmod -R a+x /etc/init.d/smbd
[实践Ok]让Samba支持软连接,方便开发的实践操作。
Unix/LinuxC技术 jackxiang 2012-8-18 18:24
今天,自己搭建一个samba时,想建立一个软链接,但发现报错:
查来查去,原来是少了一行:unix extensions = no ,少这一行,能看见软链接,但点不进去,说是权限不够。
也就是需要三行配置,如下:
samba的conf代码:
查来查去,原来是少了一行:unix extensions = no ,少这一行,能看见软链接,但点不进去,说是权限不够。
也就是需要三行配置,如下:
samba的conf代码:
PHP下一个不错的Excel类:PHP类phpExcel应用
Php/Js/Shell/Go jackxiang 2012-8-18 10:08
PHP语言在实际编写中经常会与数据库打上交道。下面我们就来一起看看PHP类phpExcel的具体使用方法。phpExcel,操作excel很方便,尤其是可以方便的加入图片,支持jpg gif png格式。
下面是总结的几个PHP类phpExcel使用方法
创建一个excel
$objPHPExcel = new PHPExcel();
PHP类phpExcel保存excel—2007格式
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter=new PHPExcel_Writer_Excel5($objPHPExcel);//非2007格式
$objWriter->save("xxx.xlsx");
直接输出到浏览器
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.xls" ');
header("Content-Transfer-Encoding:binary");
$objWriter->save("php://output");
PHP类phpExcel设置excel的属性:
阅读全文
下面是总结的几个PHP类phpExcel使用方法
创建一个excel
$objPHPExcel = new PHPExcel();
PHP类phpExcel保存excel—2007格式
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter=new PHPExcel_Writer_Excel5($objPHPExcel);//非2007格式
$objWriter->save("xxx.xlsx");
直接输出到浏览器
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.xls" ');
header("Content-Transfer-Encoding:binary");
$objWriter->save("php://output");
PHP类phpExcel设置excel的属性:
阅读全文
php文件锁(转)
Php/Js/Shell/Go jackxiang 2012-8-18 09:55
锁:这种在脚本重复跑,加上文件锁是最有效的方法,以下介绍Php的文件锁使用方法。
阅读全文
阅读全文
点评:Mysql的;group_concat这个函数在PHP和Mysql结合的优化上可能在某些时候能够派上用场,如下:
Group_Concat 是 MySQL 中用户Group By 的一个函数,函数语法如下:
这个函数在 MySQL 4.1 中被加入。函数返回一个字符串结果,该结果由分组中的值连接组合而成。
充分利用此函数,可以简化我们程序中的一些写法。
比如我们现在有一个学生成绩表,为了方便不同班级科目的设置,对学生的成绩没有采用一条记录多个字段的方式,而是采用多条记录一个成绩字段方式存储。
现在要求获得一个班级中学生各科成绩列表。
通过Group_Concat 函数,我们只要简单执行如下的SQL语句,
然后在程序中通过一个循环,将选出的结果输出来就可以了。如果不使用,我们通常需要将选出来的数据做再次整理,(多增加一些变量做一些循环判断,没有采用Group_Concat后的逻辑简单)
来自:http://www.sunnyu.com/?p=160
Group_Concat 是 MySQL 中用户Group By 的一个函数,函数语法如下:
这个函数在 MySQL 4.1 中被加入。函数返回一个字符串结果,该结果由分组中的值连接组合而成。
充分利用此函数,可以简化我们程序中的一些写法。
比如我们现在有一个学生成绩表,为了方便不同班级科目的设置,对学生的成绩没有采用一条记录多个字段的方式,而是采用多条记录一个成绩字段方式存储。
现在要求获得一个班级中学生各科成绩列表。
通过Group_Concat 函数,我们只要简单执行如下的SQL语句,
然后在程序中通过一个循环,将选出的结果输出来就可以了。如果不使用,我们通常需要将选出来的数据做再次整理,(多增加一些变量做一些循环判断,没有采用Group_Concat后的逻辑简单)
来自:http://www.sunnyu.com/?p=160
C++中,a++与++a有什么区别?
Php/Js/Shell/Go jackxiang 2012-8-12 16:37
一般来说他们的区别在于混合表达式中运算符的处理顺序。
a++是先处理其他运算,然后a再自加;
而++a则是先处理a自加运算,再处理其他表达式运算;
如果只是单纯的表达式a++;或者是++a;这两个表达式的结果就没什么区别。
譬如是
计算的结果是a=2,b=1,c=2
c=++a是表达式先处理自加运算后处理赋值运算;
b=a++是表达式先处理赋值运算后处理自加运算;
http://iask.sina.com.cn/b/16210468.html
a++是先处理其他运算,然后a再自加;
而++a则是先处理a自加运算,再处理其他表达式运算;
如果只是单纯的表达式a++;或者是++a;这两个表达式的结果就没什么区别。
譬如是
计算的结果是a=2,b=1,c=2
c=++a是表达式先处理自加运算后处理赋值运算;
b=a++是表达式先处理赋值运算后处理自加运算;
http://iask.sina.com.cn/b/16210468.html
PHP反转字符串函数strrev()函数的用法
Php/Js/Shell/Go jackxiang 2012-8-12 11:14
定义和用法
strrev() 函数反转字符串。
语法
strrev(string)
参数 描述
string 必需。规定要反转的字符串。
例子
复制代码 代码如下:
输出:
!dlroW olleH
Shell 也有对应的一个函数:
strrev() 函数反转字符串。
语法
strrev(string)
参数 描述
string 必需。规定要反转的字符串。
例子
复制代码 代码如下:
输出:
!dlroW olleH
Shell 也有对应的一个函数:
linux下的有农历的日历
Unix/LinuxC技术 jackxiang 2012-8-11 11:34
cal: linux下显示日历的一般命令
使用格式usage: cal [-13smjyV] [[month] year]
[root@jacky ccal-2.5]# cal 2 2009
八月 2012
日 一 二 三 四 五 六
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
参数介绍:
-1 输出显示当前月(默认)
-3 输出显示前一个/当前/下一个月
-s 输出显示星期天作为一周的第一天(默认)
-m 输出显示星期一作为一周的第一天
-j 输出显示Julian日历(从一月1号计数为1起,每一天计数加1)
-y 显示当前日历
ccal:网上有人做的显示有中国农历的日历
地址:http://ccal.chinesebay.com/ccal/ccal-2.5.tar.gz
安装:
tar zxf ccal-2.5.tar.gz
make
make install
root@192.168.1.104:~/software/ccal-2.5# ccal -u
August 2012 壬辰年七月大17日始
Sun 日 Mon 一 Tue 二 Wed 三 Thu 四 Fri 五 Sat 六
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 十五
中国农历是一种以月亮和太阳运动为基础的历法,又称阴阳历。每个月由月亮的运动来确定,是为阴历,所以每月初一的公历日期不定。而节气则是由太阳的位置确 定,系阳历,是故节气的公历日期基本固定。由于地球绕太阳公转的周期不可被月亮绕地球公转的周期整除,农历一段时间后就要加入闰月。虽说增加闰月的规则并 不难描述,但若没有必须的天文知识则不易懂,且计算复杂不易应用。结果就是只有极少数人知道如何计算农历,印刷的日历成了大多数人知道如春节或中秋节等农 历节日的公历日期的唯一来源。
使用格式usage: cal [-13smjyV] [[month] year]
[root@jacky ccal-2.5]# cal 2 2009
八月 2012
日 一 二 三 四 五 六
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
参数介绍:
-1 输出显示当前月(默认)
-3 输出显示前一个/当前/下一个月
-s 输出显示星期天作为一周的第一天(默认)
-m 输出显示星期一作为一周的第一天
-j 输出显示Julian日历(从一月1号计数为1起,每一天计数加1)
-y 显示当前日历
ccal:网上有人做的显示有中国农历的日历
地址:http://ccal.chinesebay.com/ccal/ccal-2.5.tar.gz
安装:
tar zxf ccal-2.5.tar.gz
make
make install
root@192.168.1.104:~/software/ccal-2.5# ccal -u
August 2012 壬辰年七月大17日始
Sun 日 Mon 一 Tue 二 Wed 三 Thu 四 Fri 五 Sat 六
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 十五
中国农历是一种以月亮和太阳运动为基础的历法,又称阴阳历。每个月由月亮的运动来确定,是为阴历,所以每月初一的公历日期不定。而节气则是由太阳的位置确 定,系阳历,是故节气的公历日期基本固定。由于地球绕太阳公转的周期不可被月亮绕地球公转的周期整除,农历一段时间后就要加入闰月。虽说增加闰月的规则并 不难描述,但若没有必须的天文知识则不易懂,且计算复杂不易应用。结果就是只有极少数人知道如何计算农历,印刷的日历成了大多数人知道如春节或中秋节等农 历节日的公历日期的唯一来源。
[实践OK]传说中的冒泡排序法在PHP中实现及排序原理描述。
Php/Js/Shell/Go jackxiang 2012-8-10 23:42
背景:在很多PHP面试上会给一些冒泡排序、或不说是冒泡排序,而说是自己实现一个按顺序排序,其实更高效呢需要更多时间写代码及思考,往往冒泡排序是最容易考察一个人对php也好,c的指针也好的一个驾驭以能力。
经典的冒泡排序法一直是许多程序沿用的其中一种排序法,话说冒泡排序法在效率上比PHP系统函数sort更高效。本章不讨论性能,所以就不拿它来跟系统性能做对比了。
我写了一个,其原理,就是无论给一个什么样的数组,其输入这个排序函数,就给按数组下标小的值小在前面,而大的给放后面,也就是相当于一个瓶子里的气泡,轻的下沉,重的上浮,这个用语言讲出来还真不太好讲:
1)对于由a[0],a[1],a[2],a[3]....a[n-2],a[n-1],n个数组,通整个数组进行扫描(挨个扫:下标:0,1一组,1,2一组...,一组发现数组下标小的值且大的则交换),一直这样交换下去会发现:
(1)最大的那个经过一次扫描就沉到最下面了。
(2)最下面那个下一次不用再扫一次了,省一次比对。
(3)根据2,对上面操作再扫一次,则这个倒数第二重的那个气泡也就排好了。
....依次类推,直至最上面两个数是最后一次,也就全排好了。(这个就是外层的一个:i最大,i--,因为内层一次后,最大那个已经到最下面了,于是,i--也就不用再扫它了)
12,45,28,30,88,67
第一次:12,28,30,45,67,88 //左右相邻比对,小下标大数值的往后挪
第二次:12,28,30,45,67,88 //这个其实一次就排好了,有些不规则的不止一次
.....
第N-1次 也就到了0,1两个下标的比对调整下位置,也就算排完了这个冒泡,确保正确。
---------- 调试PHP ----------
冒泡排序学习之PHP版本:Array
(
[0] => 12
[1] => 45
[2] => 28
[3] => 30
[4] => 88
[5] => 67
)
HeloArray
(
[0] => 12
[1] => 28
[2] => 30
[3] => 45
[4] => 67
[5] => 88
)
Output completed (0 sec consumed) - Normal Termination
下面这个是他人写的,感觉是反向,还不是太好理解,姑且放这儿吧:
冒泡排序大概的意思是依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。但其实在实际过程中也可以根据自己需要反过来用,大树往前放,小数往后放。阅读全文
经典的冒泡排序法一直是许多程序沿用的其中一种排序法,话说冒泡排序法在效率上比PHP系统函数sort更高效。本章不讨论性能,所以就不拿它来跟系统性能做对比了。
我写了一个,其原理,就是无论给一个什么样的数组,其输入这个排序函数,就给按数组下标小的值小在前面,而大的给放后面,也就是相当于一个瓶子里的气泡,轻的下沉,重的上浮,这个用语言讲出来还真不太好讲:
1)对于由a[0],a[1],a[2],a[3]....a[n-2],a[n-1],n个数组,通整个数组进行扫描(挨个扫:下标:0,1一组,1,2一组...,一组发现数组下标小的值且大的则交换),一直这样交换下去会发现:
(1)最大的那个经过一次扫描就沉到最下面了。
(2)最下面那个下一次不用再扫一次了,省一次比对。
(3)根据2,对上面操作再扫一次,则这个倒数第二重的那个气泡也就排好了。
....依次类推,直至最上面两个数是最后一次,也就全排好了。(这个就是外层的一个:i最大,i--,因为内层一次后,最大那个已经到最下面了,于是,i--也就不用再扫它了)
12,45,28,30,88,67
第一次:12,28,30,45,67,88 //左右相邻比对,小下标大数值的往后挪
第二次:12,28,30,45,67,88 //这个其实一次就排好了,有些不规则的不止一次
.....
第N-1次 也就到了0,1两个下标的比对调整下位置,也就算排完了这个冒泡,确保正确。
---------- 调试PHP ----------
冒泡排序学习之PHP版本:Array
(
[0] => 12
[1] => 45
[2] => 28
[3] => 30
[4] => 88
[5] => 67
)
HeloArray
(
[0] => 12
[1] => 28
[2] => 30
[3] => 45
[4] => 67
[5] => 88
)
Output completed (0 sec consumed) - Normal Termination
下面这个是他人写的,感觉是反向,还不是太好理解,姑且放这儿吧:
冒泡排序大概的意思是依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。但其实在实际过程中也可以根据自己需要反过来用,大树往前放,小数往后放。阅读全文
贪婪模式和最少模式:
*贪婪模式:
#php ee.php
Array
(
[0] => <h2>hello</h2><h2>world</h2>
[1] => hello</h2><h2>world
)
?问号的贪婪模式:
#php ee.php
Array
(
[0] => <h2>hello</h2>
[1] => hello
)
PHP的交互模式实践如下:
本人小新手,最近在看vbird的私房菜,在看chapter11和12时有个小疑问:
在两章中分别介绍了通配符和正则表达式的用法,两者在表达上存在差别,比如通配符用(*)表示任意多个字符,正则表达式则用(.)等等,
那么请问大家,两者使用的场合是怎么区别的呢,是根据命令的不同还是正则表达式只用于字符串的搜索匹配呢。
通配符是用来通配的
正则表达式是用来匹配字符串的
在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的。
而通配符多用在文件名上,比如查找find,ls,cp,等等。
这是我个人的一些看法,不知道对不对。
感觉通配符是系统level的
正则表达式需要相关工具的支持: egrep, awk, vi, perl。。
来源:http://bbs.chinaunix.net/thread-1255137-1-1.html
务必参考:http://blog.csdn.net/whxlovehy/article/details/6052366
如把Html里的脚本给去掉,怎么匹配,正确匹配如下:
如果没有问号,这样:<script[^>].*> ,你会发现这个> 给匹配到最后一个>了,因为是贪婪匹配,所以得加上:? ,后面一个也是一样的,
这里面有一个.*? ,这个?就是最小模式,如果说没有这个?,那么?让它去匹配:
<script type="text/javascript"></script></script> ,就会把最后的一个重复的</script>匹配上,因为是最大长度模式匹配,(第二个用的贪婪匹配),为此,这个?号作用可大了。
上面表达式中,".?是非贪婪模式匹配。也就是说,只要在一个字符后面跟上限定个数的特殊字符,匹配就是非贪婪模式了。
最终Ok的匹配且成功的结果:
结果如下:
<html><head>.</head><css></css></html>
用RegexBuddy测试好后,Copy,Copy regex as,copy regex as "//" preg string: '%<script[^>].*?>.*?</script>%' 后修改为:
$str='%<script[^>].*?>.*?</script>%'; 经测试,也是Ok的,这儿这个小工具帮我们规避掉下面文章所说的问题了。但它默认还是以//,这儿特殊它给我们规避,变为:%罢了,呵呵。
------------------------------------------------来自:http://hi.baidu.com/yglht/item/632a3dabf8a1cc9a15107300 ------------------------
遇到的问题:PHP正则preg_replace()函数 Unknown modifier 'c'问题
今天想用PHP正则去掉字符串中的JavaScript脚本,于是用了preg_replace()函数尝试。
PHP代码如下:
<?php
function ReplaceScript(&$txt)
{
$str="/<script[^>]*?>.*?</script>/si":
//[^>]*?表示匹配任意次除">"以外任意字符,但尽可能少重复
//.*? 表示匹配任意次任意字符
preg_replace("$str","",$txt);
}
$txt="<script language='javascript'> var preFrameW = '160,*'; </script>";
$txt.="hello world";
echo $txt;
ReplaceScript($txt);
echo $txt;
?>
预想结果为 连续两次输出 hello world,且查看html源代码时只有第一次会输出JavaScript代码。
但结果如下:
hello world
Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ~~~
hello world
除了这个问题很纠结外,打开html看其源代码,依然有两次JavaScript代码输出。说明JavaScript代码并没有被取代为空格。
后面经过几次修改函数中的$str变量,依次出现了 Warning: preg_replace() [function.preg-replace]: Unknown modifier '/' in ~~~ 等稀奇八怪的提示。JavaScript代码也依旧没有被替换
郁闷啊,于是又改回到最初的函数,找出PHP5帮助文档,查看preg_replace() 说明。修改ReplaceScript()函数为
function ReplaceScript(&$txt)
{
$str="/<script[^>]*?>.*?</script>/si":
print preg_replace("$str","",$txt);
}
结果是输出了三次JavaScript代码,看来还是$str问题。于是乎,奈着性子看了大量的例子。觉得没有错啊,一般匹配字符都是这么写,开始结尾均有个" / "。但是这个时候,其实我并不知道这个 / 有什么作用。呵呵,还是觉得没有错。只好百度之,在百度里看到了例外,有人居然不是用 " / "放在开头结尾,而是用 " ' "字符代替。莫非PHP默认这个字符 / 的用处仅仅就是帮助PHP界定匹配字符串的区间,在这个区间外就不匹配。而实际只要用另外的一个字符分别放在匹配字符串的开头和结尾也可以达到同样的目的。于是果断把$str换为 $str="' <script[^>]*?>.*?</script>' ": 编译again 。
呵呵,万能的神,Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ~~~这个问题终于没有了。查看生成的htm源代码,输出了三次helloworld,输出了两次JavaScript(用print函数输出的没有)。看来是识别成功了,只是$txt没有替换。于是再次修改
function ReplaceScript(&$txt)
{
$str="' <script[^>]*?>.*?</script>'si ":
print $txt=preg_replace("$str","",$txt);
}
查看结果,这次是输出了三次helloworld,只在第一次输出helloworld前输出了JavaScript,后面两次都被替换掉了。呵呵,OK,问题搞定。
总结,我犯的错误在 $str="/<script[^>]*?>.*?</script>/si": 这里面的</script>已经有一个" / "了,所以开头的 " / "就和这个 " / "形成了匹配区间,而把这个" / "之后的" script>/ " 当成了模式修正符。但实际模式修正符只有i,m,s,x,e等少数几个,而"script>/ "里面的c,r,p,> ,/ 都不是模式修正符,所以才出了Unknown modifier 'c‘ Unknown modifier '/ ’ 等问题 (没有出现 Unknown modifier 's‘ ,是因为 s 是模式匹配符啊)。
模式修正符号可以参考学习:http://hi.baidu.com/longniao/blog/item/b2af346d658ea9f3431694db.html
*贪婪模式:
#php ee.php
Array
(
[0] => <h2>hello</h2><h2>world</h2>
[1] => hello</h2><h2>world
)
?问号的贪婪模式:
#php ee.php
Array
(
[0] => <h2>hello</h2>
[1] => hello
)
PHP的交互模式实践如下:
本人小新手,最近在看vbird的私房菜,在看chapter11和12时有个小疑问:
在两章中分别介绍了通配符和正则表达式的用法,两者在表达上存在差别,比如通配符用(*)表示任意多个字符,正则表达式则用(.)等等,
那么请问大家,两者使用的场合是怎么区别的呢,是根据命令的不同还是正则表达式只用于字符串的搜索匹配呢。
通配符是用来通配的
正则表达式是用来匹配字符串的
在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的。
而通配符多用在文件名上,比如查找find,ls,cp,等等。
这是我个人的一些看法,不知道对不对。
感觉通配符是系统level的
正则表达式需要相关工具的支持: egrep, awk, vi, perl。。
来源:http://bbs.chinaunix.net/thread-1255137-1-1.html
务必参考:http://blog.csdn.net/whxlovehy/article/details/6052366
如把Html里的脚本给去掉,怎么匹配,正确匹配如下:
如果没有问号,这样:<script[^>].*> ,你会发现这个> 给匹配到最后一个>了,因为是贪婪匹配,所以得加上:? ,后面一个也是一样的,
这里面有一个.*? ,这个?就是最小模式,如果说没有这个?,那么?让它去匹配:
<script type="text/javascript"></script></script> ,就会把最后的一个重复的</script>匹配上,因为是最大长度模式匹配,(第二个用的贪婪匹配),为此,这个?号作用可大了。
上面表达式中,".?是非贪婪模式匹配。也就是说,只要在一个字符后面跟上限定个数的特殊字符,匹配就是非贪婪模式了。
最终Ok的匹配且成功的结果:
结果如下:
<html><head>.</head><css></css></html>
用RegexBuddy测试好后,Copy,Copy regex as,copy regex as "//" preg string: '%<script[^>].*?>.*?</script>%' 后修改为:
$str='%<script[^>].*?>.*?</script>%'; 经测试,也是Ok的,这儿这个小工具帮我们规避掉下面文章所说的问题了。但它默认还是以//,这儿特殊它给我们规避,变为:%罢了,呵呵。
------------------------------------------------来自:http://hi.baidu.com/yglht/item/632a3dabf8a1cc9a15107300 ------------------------
遇到的问题:PHP正则preg_replace()函数 Unknown modifier 'c'问题
今天想用PHP正则去掉字符串中的JavaScript脚本,于是用了preg_replace()函数尝试。
PHP代码如下:
<?php
function ReplaceScript(&$txt)
{
$str="/<script[^>]*?>.*?</script>/si":
//[^>]*?表示匹配任意次除">"以外任意字符,但尽可能少重复
//.*? 表示匹配任意次任意字符
preg_replace("$str","",$txt);
}
$txt="<script language='javascript'> var preFrameW = '160,*'; </script>";
$txt.="hello world";
echo $txt;
ReplaceScript($txt);
echo $txt;
?>
预想结果为 连续两次输出 hello world,且查看html源代码时只有第一次会输出JavaScript代码。
但结果如下:
hello world
Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ~~~
hello world
除了这个问题很纠结外,打开html看其源代码,依然有两次JavaScript代码输出。说明JavaScript代码并没有被取代为空格。
后面经过几次修改函数中的$str变量,依次出现了 Warning: preg_replace() [function.preg-replace]: Unknown modifier '/' in ~~~ 等稀奇八怪的提示。JavaScript代码也依旧没有被替换
郁闷啊,于是又改回到最初的函数,找出PHP5帮助文档,查看preg_replace() 说明。修改ReplaceScript()函数为
function ReplaceScript(&$txt)
{
$str="/<script[^>]*?>.*?</script>/si":
print preg_replace("$str","",$txt);
}
结果是输出了三次JavaScript代码,看来还是$str问题。于是乎,奈着性子看了大量的例子。觉得没有错啊,一般匹配字符都是这么写,开始结尾均有个" / "。但是这个时候,其实我并不知道这个 / 有什么作用。呵呵,还是觉得没有错。只好百度之,在百度里看到了例外,有人居然不是用 " / "放在开头结尾,而是用 " ' "字符代替。莫非PHP默认这个字符 / 的用处仅仅就是帮助PHP界定匹配字符串的区间,在这个区间外就不匹配。而实际只要用另外的一个字符分别放在匹配字符串的开头和结尾也可以达到同样的目的。于是果断把$str换为 $str="' <script[^>]*?>.*?</script>' ": 编译again 。
呵呵,万能的神,Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ~~~这个问题终于没有了。查看生成的htm源代码,输出了三次helloworld,输出了两次JavaScript(用print函数输出的没有)。看来是识别成功了,只是$txt没有替换。于是再次修改
function ReplaceScript(&$txt)
{
$str="' <script[^>]*?>.*?</script>'si ":
print $txt=preg_replace("$str","",$txt);
}
查看结果,这次是输出了三次helloworld,只在第一次输出helloworld前输出了JavaScript,后面两次都被替换掉了。呵呵,OK,问题搞定。
总结,我犯的错误在 $str="/<script[^>]*?>.*?</script>/si": 这里面的</script>已经有一个" / "了,所以开头的 " / "就和这个 " / "形成了匹配区间,而把这个" / "之后的" script>/ " 当成了模式修正符。但实际模式修正符只有i,m,s,x,e等少数几个,而"script>/ "里面的c,r,p,> ,/ 都不是模式修正符,所以才出了Unknown modifier 'c‘ Unknown modifier '/ ’ 等问题 (没有出现 Unknown modifier 's‘ ,是因为 s 是模式匹配符啊)。
模式修正符号可以参考学习:http://hi.baidu.com/longniao/blog/item/b2af346d658ea9f3431694db.html
如果我们想知道某个方法被谁调用了? debug_print_backtrace可以解决
debug_print_backtrace() 可以打印出一个页面的调用过程 , 从哪儿来到哪儿去一目了然.
不过这是一个PHP5的专有函数,好在pear中已经有了实现,
PHP debug_backtrace() 函数生成一个 backtrace。
该函数返回一个关联数组。下面是可能返回的元素:
名称 类型 描述
function 字符串 当前的函数名。
line 整数 当前的行号。
file 字符串 当前的文件名。
class 字符串 当前的类名
object 对象 当前对象。
type 字符串 当前的调用类型,可能的调用:
返回: "->" - 方法调用
返回: "::" - 静态方法调用
返回 nothing - 函数调用
args 数组 如果在函数中,列出函数参数。如果在被引用的文件中,列出被引用的文件名。
阅读全文
debug_print_backtrace() 可以打印出一个页面的调用过程 , 从哪儿来到哪儿去一目了然.
不过这是一个PHP5的专有函数,好在pear中已经有了实现,
PHP debug_backtrace() 函数生成一个 backtrace。
该函数返回一个关联数组。下面是可能返回的元素:
名称 类型 描述
function 字符串 当前的函数名。
line 整数 当前的行号。
file 字符串 当前的文件名。
class 字符串 当前的类名
object 对象 当前对象。
type 字符串 当前的调用类型,可能的调用:
返回: "->" - 方法调用
返回: "::" - 静态方法调用
返回 nothing - 函数调用
args 数组 如果在函数中,列出函数参数。如果在被引用的文件中,列出被引用的文件名。
阅读全文
第一步:
首先在「开始」>「执行」 然后输入:
cleanmgr /sageset:99
特别模式「清理磁碟」工具会执行,你会发觉多了很多清理选择,选择你想要清理的档案,通常全部都可以删除,完成你的选择后再按「确定」。
第二步:
你可能奇怪点选「清理磁碟」工具并有进行清理磁碟,因为 SAGESET 指令只是给你进行「清理磁碟」设定,现在我们真正进行清理磁碟。
再去「开始」>「执行」 然后打入:
cleanmgr /sagerun:99
「清理磁碟」工具就会工作。
第三步:
其实 SAGESET 指令是设定「清理磁碟」工具,Windows 会自动记下你这些设定,下次要再清理磁碟,只要再次执行cleanmgr /sagerun:99,就会用同一个设定来清理磁碟。
如要你要更改设定,只要再执行cleanmgr /sageset:99 就可以了。
首先在「开始」>「执行」 然后输入:
cleanmgr /sageset:99
特别模式「清理磁碟」工具会执行,你会发觉多了很多清理选择,选择你想要清理的档案,通常全部都可以删除,完成你的选择后再按「确定」。
第二步:
你可能奇怪点选「清理磁碟」工具并有进行清理磁碟,因为 SAGESET 指令只是给你进行「清理磁碟」设定,现在我们真正进行清理磁碟。
再去「开始」>「执行」 然后打入:
cleanmgr /sagerun:99
「清理磁碟」工具就会工作。
第三步:
其实 SAGESET 指令是设定「清理磁碟」工具,Windows 会自动记下你这些设定,下次要再清理磁碟,只要再次执行cleanmgr /sagerun:99,就会用同一个设定来清理磁碟。
如要你要更改设定,只要再执行cleanmgr /sageset:99 就可以了。
PHP对论坛帖子的过滤之海量关键字的过滤算法
Php/Js/Shell/Go jackxiang 2012-8-8 09:40
初略:
array(将=>array(军,来=>array(要=>array(升=>array(级)))),美=>array(人=>array(上,痣),女=>array(陪,聊)))
这种方式可能会高一点,但不利于海量,下面有一个思路,可以参考下。
关键词过滤的程序:
因为关键词比较多,用preg_replace效率极差,str_replace又不能有太多的关键词,strtr虽然效率比str_replace快四倍,但用于大数组效率却和str_replace比较接近,于是自己用PHP写了一个算法,觉得效率非常很不错,遂于大家分享,待程序完善后便贴出来,先占个位置
主要是思路,
对文章按字节进行遍历,然后对每个字节开始的位置进行递归匹配关键词(当然不是直接去匹配,这里做了一个技巧,是把关键词按字节的ACCSII码做为KEY分成N维数组),这样只遍历文章一次便定位出所有关键字的位置,递归部分不会减慢程序的速度,一般第一次就会被跳出,这样程序不会随关键字的数量而变慢,理论上几十万关键字和几千个个关键字速度差不多 在本机测试了下4万个关键词,替换一篇文章竟然才用0.01秒多,而str_replace 已经到了 0.4秒了,并且关键词数量越多 str_replace 时间越长。
DownLoad:
keyword.class.php 是类
example.php 是例子 和 与 str_replace的对比
badword.src.php 是关键词的文件
也可以参看:http://hi.baidu.com/actfish/item/7fc13be2431a9018585dd837
关于关键字过滤程序中发现的多层循环的改良技巧:
for循环的嵌套是很悲观的一件事情,多层嵌套时不出错的概率基本上是0(除非你的嵌套非常简单),当你的程序里充满了return,break时,是否头疼了呢?这时候我们常常忽略了C#语言的一个重要关键字“GOTO”。大胆尝试一下吧,虽然平时不鼓励使用GOTO来进行编程的,但有时候,使用它会大大提高你的效率,多层复杂循环就是“有时候”的一个时候。
array(将=>array(军,来=>array(要=>array(升=>array(级)))),美=>array(人=>array(上,痣),女=>array(陪,聊)))
这种方式可能会高一点,但不利于海量,下面有一个思路,可以参考下。
关键词过滤的程序:
因为关键词比较多,用preg_replace效率极差,str_replace又不能有太多的关键词,strtr虽然效率比str_replace快四倍,但用于大数组效率却和str_replace比较接近,于是自己用PHP写了一个算法,觉得效率非常很不错,遂于大家分享,待程序完善后便贴出来,先占个位置
主要是思路,
对文章按字节进行遍历,然后对每个字节开始的位置进行递归匹配关键词(当然不是直接去匹配,这里做了一个技巧,是把关键词按字节的ACCSII码做为KEY分成N维数组),这样只遍历文章一次便定位出所有关键字的位置,递归部分不会减慢程序的速度,一般第一次就会被跳出,这样程序不会随关键字的数量而变慢,理论上几十万关键字和几千个个关键字速度差不多 在本机测试了下4万个关键词,替换一篇文章竟然才用0.01秒多,而str_replace 已经到了 0.4秒了,并且关键词数量越多 str_replace 时间越长。
DownLoad:
下载文件
keyword.class.php 是类
example.php 是例子 和 与 str_replace的对比
badword.src.php 是关键词的文件
也可以参看:http://hi.baidu.com/actfish/item/7fc13be2431a9018585dd837
关于关键字过滤程序中发现的多层循环的改良技巧:
for循环的嵌套是很悲观的一件事情,多层嵌套时不出错的概率基本上是0(除非你的嵌套非常简单),当你的程序里充满了return,break时,是否头疼了呢?这时候我们常常忽略了C#语言的一个重要关键字“GOTO”。大胆尝试一下吧,虽然平时不鼓励使用GOTO来进行编程的,但有时候,使用它会大大提高你的效率,多层复杂循环就是“有时候”的一个时候。
Win7网络共享本地安全策略设置主体思路
一:关闭防火墙:三个防火墙,关闭家庭网络这一个即可。 (直接访问不了)
二: (登录失败:禁用当前用户)
但是Win7一会儿就会自动打开防火墙,禁止的办法:
在系统服务中找到Windows Firewall双击,选择手动或者禁用就可以了
那你运行services.msc,然后把Windows Firewall这个服务的启动类型改为“禁用”
运行–secpol.msc–本地策略–安全选项:
解决方法:
(1)共享电脑的GUEST用户被禁用:
右击“我的电脑”选择“管理”——“本地用户和组”——“用户”这时候就可以看到一个GUEST的用户,我们右击它选择“属性”这里就会弹出一个“GUEST属性”对话框(如图2),将“账户已禁用”前面的勾去掉,然后点击“确定”即可。
(2)是因为共享的电脑本地策略里面拒绝网络上面的计算机访问它: (否则会提示:登录失败:未授予在此计算机上的请求登录类型)
解决方法:打开“控制面板”里面的“管理工具”里面有一个“本地安全策略”,我们双击打开会弹出一个“本地安全策略”的对话框(如图4),这时候我们依次点击“安全设置”——“本地策略”——“用户权限分配”这时候我们在右边对话框中就可以看到一条策略,“拒绝从网络访问这台计算机”,后面还带有一个用户“GUEST”,我们双击它弹出一个“拒绝从网络访问这台计算机属性”对话框,我们选定GUEST用户点击“删除”,然后“保存”即可。
(3)是因为来宾身份验证设置的问题:
我们打开,“本地安全策略”下面的“安全设置”——“本地策略”——“安全选项”,然后我们在右边的对话框里面可以看到一个“网络访问:本地帐户的共享和安全模型”,这时候我们双击会打开一个“网络访问:本地帐户的共享和安全模型属性”对话框,然后将其修改成“仅来宾-本地用户以来宾身份验证,其身份为来宾”然后点击“确定”即可。
阅读全文
一:关闭防火墙:三个防火墙,关闭家庭网络这一个即可。 (直接访问不了)
二: (登录失败:禁用当前用户)
但是Win7一会儿就会自动打开防火墙,禁止的办法:
在系统服务中找到Windows Firewall双击,选择手动或者禁用就可以了
那你运行services.msc,然后把Windows Firewall这个服务的启动类型改为“禁用”
运行–secpol.msc–本地策略–安全选项:
解决方法:
(1)共享电脑的GUEST用户被禁用:
右击“我的电脑”选择“管理”——“本地用户和组”——“用户”这时候就可以看到一个GUEST的用户,我们右击它选择“属性”这里就会弹出一个“GUEST属性”对话框(如图2),将“账户已禁用”前面的勾去掉,然后点击“确定”即可。
(2)是因为共享的电脑本地策略里面拒绝网络上面的计算机访问它: (否则会提示:登录失败:未授予在此计算机上的请求登录类型)
解决方法:打开“控制面板”里面的“管理工具”里面有一个“本地安全策略”,我们双击打开会弹出一个“本地安全策略”的对话框(如图4),这时候我们依次点击“安全设置”——“本地策略”——“用户权限分配”这时候我们在右边对话框中就可以看到一条策略,“拒绝从网络访问这台计算机”,后面还带有一个用户“GUEST”,我们双击它弹出一个“拒绝从网络访问这台计算机属性”对话框,我们选定GUEST用户点击“删除”,然后“保存”即可。
(3)是因为来宾身份验证设置的问题:
我们打开,“本地安全策略”下面的“安全设置”——“本地策略”——“安全选项”,然后我们在右边的对话框里面可以看到一个“网络访问:本地帐户的共享和安全模型”,这时候我们双击会打开一个“网络访问:本地帐户的共享和安全模型属性”对话框,然后将其修改成“仅来宾-本地用户以来宾身份验证,其身份为来宾”然后点击“确定”即可。
阅读全文
linux账号都储存在/etc/passwd 中。
root:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
...
每一行代表一个用户,最前面是用户名称。
要想统计用户个数(统计文件行数):
wc -l /etc/passwd
详细说明:
/etc/passwd是个文本文件,每行一条记录,格式:
account:password:UID:GID:GECOS:directory:shell (帐号: 密 码: 用户ID:组ID:一般的信息:目录:shell)
字段描述如下:
account 使用者在系统中的名字,它不能包含大写字母
password 加密的用户密码,或者星号
UID 用户 ID 号
GID 用户的主要组 ID 号
GECOS 这字段是可选的,通常为了存放信息目的而设的.通常,它包含了用户的全名
directory 用户的 $HOME 目录
shell 登录时运行的程序(如果空的,使用/bin/sh). 如果设为不存在的执行(程序),用户不能通过 login(1) 登录
基于安全考虑,密码在/etc/passwd中通常为*号,而真正的密码(加密过的)放在/etc/shadow
----------------------
root:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
...
每一行代表一个用户,最前面是用户名称。
要想统计用户个数(统计文件行数):
wc -l /etc/passwd
详细说明:
/etc/passwd是个文本文件,每行一条记录,格式:
account:password:UID:GID:GECOS:directory:shell (帐号: 密 码: 用户ID:组ID:一般的信息:目录:shell)
字段描述如下:
account 使用者在系统中的名字,它不能包含大写字母
password 加密的用户密码,或者星号
UID 用户 ID 号
GID 用户的主要组 ID 号
GECOS 这字段是可选的,通常为了存放信息目的而设的.通常,它包含了用户的全名
directory 用户的 $HOME 目录
shell 登录时运行的程序(如果空的,使用/bin/sh). 如果设为不存在的执行(程序),用户不能通过 login(1) 登录
基于安全考虑,密码在/etc/passwd中通常为*号,而真正的密码(加密过的)放在/etc/shadow
----------------------