先给你一个函数
<?php
/**
*
* 作者: 徐祖宁 (唠叨)
* 邮箱: [email protected]
* 开发: 2002.07
*
*
* 函数: tags
* 功能: 从文件中提取HTML标签
*
* 入口:
* $filename 文件名
* $tag 标签名
* 返回:
* 数组,每项为:
* tagName String
* Text String
* Attrs Array
*
* 示例:
* print_r(tags("test1.htm","a"));
* print_r("http://localhost/index.htm","img");
*
*/function tags($filename,$tag) {
$buffer = join("",file($filename));
$buffer = eregi_replace("\r\n","",$buffer);
$tagkey = sql_regcase($tag);
$buffer = eregi_replace("<$tagkey ","\n<$tag ",$buffer);
$ar = split("\n",$buffer); foreach($ar as $v) {
if(! eregi("<$tagkey ",$v)) continue;
eregi("<$tagkey ([^>]*)((.*)</$tagkey)?",$v,$regs);
$p[tagName] = strtoupper($tag);
if($regs[3])
$p[Text] = substr($regs[3],1);
$s = trim(eregi_replace("[ \t]+"," ",$regs[1]))." ";
$s = eregi_replace(" *= *","=",$s); $a = split(" ",$s);
for($i=0;$i<count($a);$i++) {
$ch = array();
if(eregi("=[\"']",$a[$i])) {
$j = $i+1;
while(!eregi("[\"']$",$a[$i])) {
$a[$i] .= " ".$a[$j];
unset($a[$j]);
}
}
}
foreach($a as $k) {
$name = strtoupper(strtok($k,"="));
$value = strtok("\0");
if(eregi("^[\"']",$value))
$value = substr($value,1,-1);
if($name)
$p[Attrs][$name] = $value;
}
$pp[] = $p;
}
return $pp;
}?>
<?php
/**
*
* 作者: 徐祖宁 (唠叨)
* 邮箱: [email protected]
* 开发: 2002.07
*
*
* 函数: tags
* 功能: 从文件中提取HTML标签
*
* 入口:
* $filename 文件名
* $tag 标签名
* 返回:
* 数组,每项为:
* tagName String
* Text String
* Attrs Array
*
* 示例:
* print_r(tags("test1.htm","a"));
* print_r("http://localhost/index.htm","img");
*
*/function tags($filename,$tag) {
$buffer = join("",file($filename));
$buffer = eregi_replace("\r\n","",$buffer);
$tagkey = sql_regcase($tag);
$buffer = eregi_replace("<$tagkey ","\n<$tag ",$buffer);
$ar = split("\n",$buffer); foreach($ar as $v) {
if(! eregi("<$tagkey ",$v)) continue;
eregi("<$tagkey ([^>]*)((.*)</$tagkey)?",$v,$regs);
$p[tagName] = strtoupper($tag);
if($regs[3])
$p[Text] = substr($regs[3],1);
$s = trim(eregi_replace("[ \t]+"," ",$regs[1]))." ";
$s = eregi_replace(" *= *","=",$s); $a = split(" ",$s);
for($i=0;$i<count($a);$i++) {
$ch = array();
if(eregi("=[\"']",$a[$i])) {
$j = $i+1;
while(!eregi("[\"']$",$a[$i])) {
$a[$i] .= " ".$a[$j];
unset($a[$j]);
}
}
}
foreach($a as $k) {
$name = strtoupper(strtok($k,"="));
$value = strtok("\0");
if(eregi("^[\"']",$value))
$value = substr($value,1,-1);
if($name)
$p[Attrs][$name] = $value;
}
$pp[] = $p;
}
return $pp;
}?>
Update: 2002-10-16--------------------------------------------------------------------------------
如果我们问那些UNIX系统的爱好者他们最喜欢什么,答案除了稳定的系统和可以远程启动之外,十有八九的人会提到正则表达式;如果我们再问他们最头痛的是什么,可能除了复杂的进程控制和安装过程之外,还会是正则表达式。那么正则表达式到底是什么?如何才能真正的掌握正则表达式并正确的加以灵活运用?本文将就此展开介绍,希望能够对那些渴望了解和掌握正则表达式的读者有所助益。 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。 正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。 举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。 希望本专题的一系列文章能帮您解开正则表达式的神秘面纱...
--------------------------------------------------------------------------------
来源:Phpuser.com
确定重复出现到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。 字符簇 含义
^[a-zA-Z_]$ 所有的字母和下划线
^[[:alpha:]]{3}$ 所有的3个字母的单词
^a$ 字母a
^a{4}$ aaaa
^a{2,4}$ aa,aaa或aaaa
^a{1,3}$ a,aa或aaa
^a{2,}$ 包含多于两个a的字符串
^a{2,} 如:aardvark和aaab,但apple不行
a{2,} 如:baad和aaa,但Nantucket不行
t{2} 两个制表符
.{2} 所有的两个字符 这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串
^[0-9]{1,}$ //所有的正数
^-{0,1}[0-9]{1,}$ //所有的整数
^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ //所有的小数 最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个可选的小数点(.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。特殊字符"?"与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:^-?[0-9]{0,}.?[0-9]{0,}$ 特殊字符"*"与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符"+"与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串
^[0-9]+$ //所有的正数
^-?[0-9]+$ //所有的整数
^-?[0-9]*.?[0-9]*$ //所有的小数 当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。
$input="我对正则很头疼啊又很有兴趣;发现正则对与搜索实在是太方便了;各位大叔大婶能不能教教我啊???教会了我单个给500分哦!
先说两个例子吧:
比如论坛上有这么一些东西:
015B - dan bal muh ri
mms://media.tube.co.kr/musicvideo/1k1030000186_106.asf 1tym -
~one love
mms://media.tube.co.kr/musicvideo/1k1030000464_106.asf
~1tym
mms://media.tube.co.kr/musicvideo/1k1030000364_105.asf
~nuh wa na oo ri youngwon hi ddo hana!
mms://media.tube.co.kr/musicvideo/1k1030000464_110.asf
~make it last
http://urequest.tripod.com/cgi-bin/1tym_ma...keitlast_mv.asf
~nasty
http://urequest4.tripod.com/cgi-bin/1tym_nasty.asf ace - hon ja man ui kkoom
mms://media.tube.co.kr/musicvideo/1k1030000873_102.asf Ak Dong Club -
~ remember
mms://kmtv.hananet.net/1818/stream_vod/kayo_vod/KV01303.asf ahn jae wook - in yun
mms://media.tube.co.kr/musicvideo/1k1010000292_104.asf
<img src=pic1.gif >
Ann -
~memories
http://ann.waveprod.com/video/memory_cable.wmv
~keu deh ae geh ga gi gga ji (with choi won suk)
mms://media.tube.co.kr/musicvideo/1o5010000854_103.asf
<img src= \"pic.gif\">As One -
~Day by Day
<img src='pic3.gif'>
mms://kmtv.hananet.net/1818/stream_vod/kayo_vod/KV00300.asf
";echo "所有链接:<br>";
preg_match_all ("/([a-z]+):\/\/([^ \f\r\t\n] +)/x",$input, $files);for($i=0;$i<count($files[0]);$i++){
echo $files[0][$i]."<br>";
}
echo "所有图片:<br>";
preg_match_all ("/(\<img[ \f\r\t\n]+)src\=[ \f\r\t\n\"\']*([^ \f\r\t\n\"\']+)/x",$input,$pics);for($i=0;$i<count($pics[0]);$i++){
echo $pics[2][$i]."<br>";
}?>
如< IMG src="sadfWSD.gif">
改成这样:echo "所有图片:<br>";
preg_match_all ("/(\<[ \f\r\t\n]*[Ii][Mm][Gg][ \f\r\t\n]+)[Ss][Rr][Cc]\=[ \f\r\t\n\"\']*([^ \f\r\t\n\"\']+)/x",$input,$pics);for($i=0;$i<count($pics[0]);$i++){
echo $pics[2][$i]."<br>";
}
特别是photo123哈
您说的preg_match_all ("/([a-z]+):\/\/([^ \f\r\t\n] +)/x",$input, $files);
我还不大明白
([a-z]+)是不是允许a-z中的一个重复多次呢?
这样写行不行?([a-zA-Z]{3,4}) ?
还有([^\f\r\t\n]+)是不是可以这样([^\s]+)???但是是什么意思哦???
可以这样吗?([a-zA-Z0-9]+\.[a-zA-Z0-9]+)+ ???
还有最后一个参数接收的是什么类型啊??数组??=)*
preg_match_all ("/([a-zA-Z]+):\/\/([^ \f\r\t\n] +)/x",$input, $files);[^ \f\r\t\n]:
^表示非
所有的方括号内的匹配非空字符,也就是不是空格、换行、回车、TAB之类的字符。
还有([^\f\r\t\n]+)是不对的,应该是([^ \f\r\t\n]+),少了一个空格字符。
[a-z]{3,4}是匹配长度大于等于3,小于等于4的英文小写字符
[a-z]+是匹配长度大于等于1的英文小写字符,等价于[a-z]{1,}
\s匹配单个空格符,包括tab键和换行符
不匹配回车符最后一个参数接收的是一个二维数组
第一维:下标为0:与整个正则表达式匹配的字符串。
下标1...N:与正则表达式中第N个()匹配的字符串。
第二维表示第N个匹配的字符串。
[^ \f\r\t\n] ?为什么这么写呢?意义何在?
还有 你能不能给我讲讲 ? 这个的使用
什么情况下是用做{0,1} 什么情况下是表示贪婪模式??
其中
“ ”空格
“\f”换页符
“\r”回车符
“\t”制表符
“\n”换行符{0,1} 匹配0个或一个可写做?,意义是可能出现一次一般都是“贪婪模式”,非贪婪模式在不同的版本中表现不好
[^ \f\r\t\n] 非空模式就url符合了?