代码如下 | 复制代码 |
<?php #########随机广告显示########## function myads(){ $dir="ads"; #设置存放记录的目录 //$dir="ads"; #设置存放记录的目录 $ads="$dir/ads.txt"; #设置广告代码文件 $log ="$dir/ads.log"; #设置ip记录文件 $ads_lines=file($ads); $lines=count($ads_lines);#文件总行数 ####读出广告总数$ads_count和显示次数到数组$display_array######## $ads_count=0; $display_count=0; for ($i=0;$i<$lines;$i++){ if((!strcmp(substr($ads_lines[$i],0,7),"display"))){ $ads_count+=1; $display_array[$ads_count]=substr($ads_lines[$i],8); $display_count+=$display_array[$ads_count]; } } ####决定随机显示序号$display_rand##### srand((double)microtime()*1000000); $display_rand = rand(1,$display_count); ###决定广告序号$ads_num###### $pricount=0; $ads_num=1; for($i=1; $i<=$ads_count; $i++) { $pricount += $display_array[$i]; if ($display_rand<=$pricount) {$ads_num=$i;break;} } #####播放广告######## $num=0; $flag=0; for($i=0;$i<$lines;$i++){ if((!strcmp(substr($ads_lines[$i],0,7),"display"))){$num++;} if(($num==$ads_num)and($flag==0)){$flag=1;continue;} if(($flag==1)and strcmp($ads_lines[$i][0],"#")){echo $ads_lines[$i];continue;} if(($flag==1)and(!(strcmp($ads_lines[$i][0],"#")))){break;} } ####纪录广告显示次数######### $fp=fopen($log,"a"); fputs($fp,date( "Y-m-d H:i:s " ).getenv("REMOTE_ADDR")."==>".$ads_num."n"); fclose($fp); } ?> |
广告代码文件ads.txt
代码如下 | 复制代码 |
########每个广告代码之间用'#'隔开,display为显示加权数,越大显示次数越多################ ################################ display=10 <a href="http://www.111cn.net"> <img" width=100% src="h/c_banner.gif" alt="Chance2mail,好礼物送给您!"> </a> ################################ display=10 <a href="http://www.111cn.net" target=_blank> <img" width=100% src="8848.gif" width="468" height="60" border="0"></a> |
调用
<?php myads();?>
即可
本文章来给大家介绍php反中文汉字转Unicode编码实现程序方法,有需要了解的朋友可进入参考。程序
代码如下 | 复制代码 |
/** |
使用范例:
代码如下 | 复制代码 |
//GBK字符串测试 |
对于一维数组我们可以如下操作
in_array '函数在数组中搜索给定的值。in_array(value,array,type)type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
array_key_exists 'array_key_exists() 函数判断某个数组中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false。array_key_exists(key,array)
array_search 'array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。array_search(value,array,strict)
从这里来看,在数据量不大的时候,比如小于1000,查找用哪一种都行,都不会成为瓶颈;
当数据量比较大的时候,用array_key_exists比较合适。
当然这里array_key_exists占用的内存比较大,经测算
二分法查找数组是否包含某一元素,兼容正反序,代码实现:
代码如下 | 复制代码 |
<?php $searchValue = (int)$_GET['key']; function search(array $array, $value) while (TRUE) { if ($max < $min) { $array = array( // 逆序 |
例二
PHP 查找数组第i小元素
代码如下 | 复制代码 |
<?php |
判断一个字符串是否含有超级链接
代码如下 | 复制代码 |
$str="ssdsf<a target='_blank' href='http://www.111cn.net/' >sdf</a>sdfss"; |
下面我们只要过滤连接部份。
代码如下 | 复制代码 |
<?php |
正则:/(?<=href=)([^>]*)(?=>)/
(?<=exp) 匹配exp后面的位置
(?=exp) 匹配exp前面的位置
此正则 匹配 在 href= 之后 “>” 之前 的 非 “>” 的所有字符
例子:<a href='www.111cn.net '>
找到这些字符(url)用 # 替换,就可以去掉html里的所有链接。
现在分享一个提取超级连接的实例
代码如下 | 复制代码 |
function match_links($document) { preg_match_all("'<s*as.*?hrefs*=s*(["'])?(?(1)(.*?)\1|([^s>]+))[^>]*>?(.*?)</a>'isx",$document,$links); while(list($key,$val) = each($links[2])) { if(!empty($val)) $match['link'][] = $val; } while(list($key,$val) = each($links[3])) { if(!empty($val)) $match['link'][] = $val; } while(list($key,$val) = each($links[4])) { if(!empty($val)) $match['content'][] = $val; } while(list($key,$val) = each($links[0])) { if(!empty($val)) $match['all'][] = $val; } return $match; } |
提取src=里面的图片地址还不足够,因为不能保证那个地址一定是绝对地址,完全的地址,如果那是相对的呢?如果地址诸如:
albums/Candids/thumb_P1050338.jpg
/content/media/touts/5271608/5271654/15320982
那该如何是好?
有时在这些地址前面需要加http://example1.com/ ,有些甚至要加http://example1.com/example2/.../ 于是,要写出出一种法则符合所有要求,简直是天方夜谭。只能见机行事对症下药。有时,需要从前面动刀,有时需要从后面砍断。
今天,我惊讶地知道了一个道理,原来http://example.com/ 和http://example.com////// 是一样的!
http://img3.douban.com/pics/nav/lg_main_a6.png
和
http://img3.douban.com////pics////nav///lg_main_a6.png
最终你都能到达
图片网址规范的html代码无非就是
1 <img" width=100% src="??" title="??" alt="??" border="??" width="??" height="??" />
??和??是非必需的,若要通过XHTML认证??、??、??、??必不可少。
就正则谈正则的话,我写出的最短匹配是
1 (?<=img.+?src=").*?(?=")
不过,这条在php里不行,会出现:
1 Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset *** in ***
纠结了很久,都不行,原因何在呢?试了很多次,终于发现问题在(?<=img.+?src=")这个零宽断言里,在php中,零宽断言里不支持类似“*”、“+”这些无限次的东西,于是报错了,把“.+?”改为定长就好。不过,要“img”和“src=”之间定长基本上是不可能的。通常,图片地址的img和src只会相隔一个很简单的空格,但不排除某些情况在src之前,img后有alt、titlte等东西。
所以
1 (?<=img.src=").*?(?=")
或
1 (?<=imgssrc=").*?(?=")
可能可以,但不保证100%没问题。
你也许会问,单纯
1 (?<=src=").*?(?=")
不行吗?通常情况,可以,但,搜索过页面的盆友应该知道,除了图片地址用src开头以外,javascript地址也用src开头!而且,太多神通广大的不可预知因素隐含其中,于是这个貌似很简短完美的写法就行不通了。
你又或许会问,聪明简短的不行,我把图片的后缀列出来,总该可以了吧,如
1 (?<=src=").*?.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)
的确,这个写法实在是很老实,不过,你见过没有后缀的图片?wwe.com 有很多这种例子呢
RAW http://us.wwe.com/content/media/images/Headers/15559182
SmackDown http://us.wwe.com/content/media/images/Headers/15854138
NXT http://us.wwe.com/content/media/images/Headers/15929136
Superstars http://us.wwe.com/content/media/images/Headers/15815850
上面的网址都是图片,但都没有传统后缀,你老实也没用,还是不能获取到它们。
怎么办呢?还可以这样
1 <img(.*?)src="(.*?)(?=")
和上面的表达式不同,这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。为什么呢?因为我们用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。个人感觉还是不错的,呵呵。当然了,如果你还有更好的建议,请马上留言,全球人民都会感谢你!
你到底要什么样的图片,是固定格式还是其它?得具体情况具体分析呢。
我的建议是:
如果你要的图片地址的格式是img空格src=的,请使用:(?<=img.src=").*?(?=") ,数组唯一,你懂的。
否则,请使用<img(.*?)src="(.*?)(?=") ,记得留意有用内容所在的数组位置哦!
并在项目中使用了很长时间的正则吧.
/<img.*srcs*=s*["|']?s*([^>"'s]*)/i
,我使用kindeditor保存文章,但是需要取出第N个图片的地址作为文章的标志图片,文章代码(内容的html)保存到数据库一个字段,然后图片地址保存到另外一个字段.我就是使用上面的正则解决的.
我说明下,上面的地址是直接获取img标签内src属性的值.在使用该正则的php页面访问该路径如果能找到图片的话,可以直接使用,如果不能,你可以使用preg_match_all将所有地址先保存到数组,然后处理路径,比如获取文件名称(不含路径部分),然后重新组成url,再删除图片.
我的例子:
preg_match_all("/<img.*srcs*=s*["|']?s*([^>"'s]*)/i",str_ireplace("\","",$content),$arr);
呵呵 我的内容部分被php给加上转义了,所以我需要先把去除,str_ireplace("\","",$content),然后将匹配的内容保存到$arr数组(二维的).
$arr[1]就是存储该路径的数组.