PHP有验证的模拟Post表单提交(验证码需要手工输入)

先学习一下正则表示式:

$content = <<
EOF;

preg_match('{]*>}i',$content,$matches1);
echo $matches1[1];
//输出:reg_username

preg_match('{(]*>)}i',$content,$matches2);
echo $matches2[1];
//输出:

引入自定义curl_url函数:

//定义curl_url函数
function curl_url($url,$if_echo,$follow_location,$use_ssl,$has_header,$is_post,$create_cookie,$load_cookie)
{
global $cookie_file,$post_data,$contents,$header;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($follow_location == "follow_location_yes")
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if ($follow_location == "follow_location_no")
{
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_HEADER,1);
}
if ($use_ssl == "use_ssl_yes")
{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
}
if ($has_header == "has_header_yes")
{
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
}
if ($is_post == "is_post_get" or $is_post == "is_post_post")
{
if ($is_post == "is_post_post")
curl_setopt($ch, CURLOPT_POST, 1);
if ($is_post == "is_post_get")
curl_setopt($ch, CURLOPT_POST, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
if ($create_cookie == "create_cookie_yes" or $load_cookie == "load_cookie_yes")
{
if ($create_cookie == "create_cookie_yes")
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
if ($load_cookie == "load_cookie_yes")
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
}
curl_setopt ($ch, CURLOPT_PROXY,"http://127.0.0.1:8087");
//curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$contents = curl_exec($ch);
curl_close($ch);
if ($if_echo == "echo_yes")
echo $contents;
}

注册帐号代码部分:

//调用实例,注册pligg
$blog_url = "http://androidbookmark.com/";
$username = "";
$email = "";
$password = "";
pligg_register($blog_url,$username,$email,$password);

function pligg_register($blog_url,$username,$email,$password)
{
global $cookie_file,$post_data,$contents,$header;
$url = "{$blog_url}register.php";
$form = <<
EOF;
curl_url($url,"echo_no","follow_location_no","use_ssl_no","has_header_no","is_post_no","create_cookie_no","load_cookie_no");
//获取注册表单
preg_match('{(]+register[^><]+>s*(.*?)s*)}is',$contents,$matches);
//给含有name,password,email的字段赋值
preg_match_all('{name=["|']([^"']*(name|email|password)[^"']*)["|']}i',$matches[1],$matches2);
foreach ($matches2[1] as $item)
{
if (preg_match('{name}i',$item))
$form .= <<n
EOF;
if (preg_match('{password}i',$item))
$form .= <<n
EOF;
if (preg_match('{email}i',$item))
$form .= <<n
EOF;
}
//获取表单中的验证码字段
preg_match_all('{(<(script|noscript)[^<>]*>(.*?))}is',$matches[1],$matches3);
foreach ($matches3[1] as $script)
$form .= "$scriptn";

//获取submit按钮
preg_match_all('{(<(input|button)(.*?)type="submit"([^>]+)>(.*?)n)}i',$matches[1],$matches4);
$form .= "{$matches4[1][0]}n";

$form .= <<n

EOF;
echo "$form";
}

模拟登录以及提交书签部分代码

$blog_url = "http://androidbookmark.com/";
$username = "";
$password = "";
$link = "";
$title = "";
$content = <<]*)>}i',$contents,$matches);
$post_data = "";
for ($i=0;$i]+submit[^><]+>s*(.*?)s*)}is',$contents,$matches);
$form_content = $matches[1];
preg_match_all('{(<(script|noscript)[^<>]*>(.*?))}is',$form_content,$matches);
$form = <<
EOF;
foreach ($matches[1] as $script)
{
$form .= "$scriptn";
}
$form .= "{$matches[1][0]}n";
$form .= <<
EOF;
$form .= "";
//模拟提交第二步2,其它变量赋值
preg_match_all('{}i',$form_content,$matches);
$post_data = "";
for ($i=0;$i]*>(.*?)}is',$form_content,$matches);
$post_data .= "category={$matches[1][0]}&";
if ($action == "")
{
echo $form;
}
if ($action == "code")
{
preg_match_all('{name="(.*?)"}i',$form,$matches_code);
$item1 = $matches_code[1][0];
$item2 = $matches_code[1][1];
$$item1 = $_POST["$item1"];
$$item2 = $_POST["$item2"];
$post_data .= "title=$title&bodytext=$content&$item1={$$item1}&$item2={$$item2}";
curl_url($url,"echo_no","follow_location_yes","use_ssl_no","has_header_yes","is_post_post","create_cookie_no","load_cookie_no");
//模拟提交第三步
preg_match_all('{}i',$contents,$matches);
$post_data = "";
for ($i=0;$i
	

mysql查询随机记录以及分页(limit),in的运用

首先引入一个获取当前时间戳,精确到毫秒的函数

function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

直接使用order by rand()的代码片段1:

$sql = "select * from driverscollection.driver_list order by rand() limit 5";
$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs))
{
echo "{$row["driver_name"]}
n"; } //本段代码执行时间:165.33495497704秒

先提取索引字段driver_id的代码片段2:

$sql = "select driver_id from driverscollection.driver_list";
$rs = mysql_query($sql);
$array_driver_id = array();
while ($row = mysql_fetch_array($rs))
{
$array_driver_id[] = $row["driver_id"];
}
$arr_new = array_rand($array_driver_id,5);
$sql2 = "select * from driverscollection.driver_list where driver_id in (";
foreach ($arr_new as $item)
$sql2 .= "$item,";
$sql2 .= "0)";

$rs2 = mysql_query($sql2);
while ($row2 = mysql_fetch_array($rs2))
{
echo "{$row2["driver_name"]}
n"; } //本段代码执行时间:0.9744188785553秒

先提取索引字段driver_id的代码片段3:

$sql = "select driver_id from driverscollection.driver_list order by rand() limit 5";
$sql2 = "select * from driverscollection.driver_list where driver_id in (";
$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs))
{
$sql2 .= "{$row["driver_id"]},";
}
$sql2 .= "0)";
$rs2 = mysql_query($sql2);
while ($row2 = mysql_fetch_array($rs2))
{
echo "{$row2["driver_name"]}
n"; } //本段代码执行时间:0.62469720840454秒

代码片段2和片段3执行时间一样,差别在于片段2选取出driver_id所有的值,组成一个数组,再从数组中随机选取5个数值,而片段3直接利用order by rand()选取出5个driver_id的数值.虽然片段3也用了order by rand(),但和片段1的差别在于片段3选取的是已建立索引的driver_id(主键),而片段1则是select *导致效率低下。

直接适用”limit m,n”代码片段4:

$sql = "select * from driverscollection.driver_list limit 430000,10";
$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs))
{
echo "{$row["driver_name"]}
n"; } //本段代码执行时间:40.328853130341秒

不直接适用”limit m,n”代码片段5:

$sql = "select driver_id from driverscollection.driver_list limit 430000,10";
$sql2 = "select * from driverscollection.driver_list where driver_id in (";
$rs = mysql_query($sql);
$array_driver_id = array();
while ($row = mysql_fetch_array($rs))
{
$sql2 .= "{$row["driver_id"]},";
}
$sql2 .= "0)";
$rs2 = mysql_query($sql2);
while ($row2 = mysql_fetch_array($rs2))
{
echo "{$row2["driver_name"]}
n"; } //本段代码执行时间:0.12213778495789秒

使用between value1 and value2代码片段6:

$sql = "select * from driverscollection.driver_list where driver_id between 430000 and 430009";
$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs))
{
echo "{$row["driver_name"]}
n"; } //在mysql中,between包含了value1和value2边界值,本段代码执行时间0秒 //本段代码消耗时间:0.0012149810791016秒

比较片段4和片段5可以看出,对于已建立了索引(尤其是主键),使用limit是很快的,而对于select *使用limit就会慢很多,在这个时候可以考虑先select driver_id(主键),然后再用driver_id in (),这样效率就有明显的提升。

综上所述,对于数据量较大的查询,最好先select id(主键),再用id in ()进行select *操作;对于id(主键)连续的,还可以使用between.

PHP网页采集的技巧

在采集网页数据的过程中,主要就是调用curl_url函数:

function curl_url($url,$if_echo,$follow_location,$use_ssl,$has_header,$is_post,$create_cookie,$load_cookie)
{
global $cookie_file,$post_data,$contents,$header;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($follow_location == "follow_location_yes")
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if ($follow_location == "follow_location_no")
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_HEADER,1);
if ($use_ssl == "use_ssl_yes")
{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
}
if ($has_header == "has_header_yes")
{
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
}
if ($is_post == "is_post_get" or $is_post == "is_post_post")
{
if ($is_post == "is_post_post")
curl_setopt($ch, CURLOPT_POST, 1);
if ($is_post == "is_post_get")
curl_setopt($ch, CURLOPT_POST, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
if ($create_cookie == "create_cookie_yes" or $load_cookie == "load_cookie_yes")
{
if ($create_cookie == "create_cookie_yes")
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
if ($load_cookie == "load_cookie_yes")
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
}
//curl_setopt ($ch, CURLOPT_PROXY,"http://127.0.0.1:8087"); //使用goagent代理
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //超时设置
$contents = curl_exec($ch);
curl_close($ch);
if ($if_echo == "echo_yes")
echo $contents;
}

调用格式如下:

curl_url($url,"echo_yes","follow_location_yes","use_ssl_no","has_header_no","is_post_no","create_cookie_no","load_cookie_no");

在调用curl_url时,首先要确保echo_yes时能正常显示页面,如不能正常显示,主要注意的问题有:

[1]url地址,是否首尾有空格

$url = trim($url);
curl_url($url,"echo_yes","follow_location_yes","use_ssl_no","has_header_no","is_post_no","create_cookie_no","load_cookie_no");

[2]url地址是否发生跳转,follow_location_yes和follow_location_no这两种情况都要试试,在follow_location_no的情况后,看看转向后的地址是否正常展示;

curl_url($url,"echo_yes","follow_location_yes","use_ssl_no","has_header_no","is_post_no","create_cookie_no","load_cookie_no");
curl_url($url,"echo_yes","follow_location_no","use_ssl_no","has_header_no","is_post_no","create_cookie_no","load_cookie_no");

[3]url地址的协议,如果是https协议,要将use_ssl_no改成use_ssl_yes;

curl_url($url,"echo_yes","follow_location_yes","use_ssl_yes","has_header_no","is_post_no","create_cookie_no","load_cookie_no");

[4]url地址是否在goagent代理下能正常显示,如不能,需要关闭http代理功能;

//curl_setopt ($ch, CURLOPT_PROXY,"http://127.0.0.1:8087"); //使用goagent代理

在获取网页源代码后,通过正则获得需要的数据,这里主要用到的是preg_match和preg_match_all函数

问题1:匹配出字符串中所有的trackback地址

$content = <<http://pinklemonpark.com/shop_bb/book_appointment_2/211/90e/trackback
http://www.dear-one.net/zb/index.php?document_srl=2888&act=trackback&key=c74
http://www.medart.co.kr/xe/index.php?document_srl=1637&act=trackback&key=355
TrackBack URL

trackback:ping="http://blog.mayaline.com//u8uj/trackback.aspx?postID=373572"
EOF;
preg_match_all('{=['|"]([^()"']+trackback[^()"']*)['|"]}i',$content,$matches);
//此处 ['|"] 匹配单引号或者双引号
//此处 ([^()"']+trackback[^()"']*) 匹配网址,该字符串中包含trackback,且在trackback前面([^()"']+即1或多个字符且不包含引号和小括号,trackback后面([^()"']*即0或多个字符且不包含引号和小括号
for ($i=0;$in";
}

问题2:匹配出字符串中所有的name和value值

$content = <<










EOF;
if (preg_match_all('{]*name=["|'](.*?)["|'][^"']*value=["|'](.*?)["|']}is',$content,$matches2))
{
for ($i=0;$in";
}
}

问题3:匹配出符合条件的网址以及对应的日期

$content = <<

Acer Aspire V5-573PG BIOS 2.12 for Windows 8 64-bit

BIOS / Acer | 3.40 MB | Windows 8 64 bit

September 23rd, 02:21 GMT

NETGEAR WNR3500Lv1 Router Firmware 1.2.2.48 (NA)

Firmware / NETGEAR | 5.20 MB | OS Independent

September 22nd, 08:58 GMT

Tenda W311M WLAN Driver 3.0

Network Card / Tenda | 69.50 MB | Windows XP / Windows Vist…

September 21st, 23:55 GMT

EOF; //$today = date(“F jS”); //$yestoady = date(“F jS”,strtotime(“-1 day”)); //if (preg_match_all(‘{

]+>(.*?)s*(.*?)>(‘.$today.’|’.$yestoady.’)+([^><]+)GMT

}is’,$content,$matches2)) if (preg_match_all(‘{

]+>s*(.*?)>September (23rd|22nd)+([^><]+)GMT

}is’,$content,$matches2)) { for ($i=0;$i $title
$time
n EOF; } }

PHP正则表达式的学习

$content = <<google.com,Baidu:baidu.com,Yahoo:yahoo.com
EOF;
$content = preg_replace('{"'s]+)(["|']?)([^>]*)>(.*?)}i','$6',$content);
echo $content;
//此处 (.*?) 匹配任意字符;
//此处 (["|']?) 匹配单引号双引号或者无引号
//此处 ([^>"'s]+) 匹配网址,表示该字符串不包含>和"和'等三种符号以及空格;
//此处 ([^>]*) 匹配网址标签中href属性之后的其它内容,该字符串可以为空,也可以为不包含>的字符串;
//要点:‘*’ ‘+’ 和 ‘?’ 只管它前面那个字符,*表示0或多个,+表示1或者多个;?表示0或1个;
//()代表的是分组,[]代表的是字符集合,

$content2 = <<n";


$content3 = <<n"; //同样匹配到5

$content4 = <<google.com,Baidu:baidu.com,Yahoo:yahoo.com
EOF;
$result1 = strip_tags($content4); //过滤所有html标签
echo "result1:$result1
n"; $result2 = strip_tags($content4,""); //过滤html标签,只保留a标签 echo "result2:$result2
n"; $result3 = preg_replace('{(.*?)
}i','',$content4); //过滤a标签以及内容; echo "result3:$result3
n"; $result4 = preg_replace('{"'s]+)(["|']?)([^>]*)>(.*?)}i','qq.com',$content4); //替换超链接为自定义链接; echo "result4:$result4
n"; $result5 = preg_replace('{"'s]+)(["|']?)([^>]*)>(.*?)}i','$6',$content4); //过滤a标签的所有属性 echo "result5:$result5
n"; //html源代码的一些标签过滤 $content = preg_replace("#s*(.*?)s*#is", "",$content); //过滤script标签里面所有的内容 $content = preg_replace("##is","",$content); //不匹配连续字符串的正则 (b((?!strike).)*b) 表示单词中不包含strike $content = <<

$10.99

$9.99


$7.99 EOF; preg_match_all('{

[sS]+"(b((?!strike).)*b)">(.*?)}i',$content,$matches); print_r($matches[3]);

以下内容为转摘部分:
将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’n’ 或 ’r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’n’ 或 ’r’ 之前的位置。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。
{n} n 是一个非负整数,匹配确定的n 次。
{n,} n 是一个非负整数,至少匹配n 次。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
. 匹配除 "n" 之外的任何单个字符。要匹配包括 ’n’ 在内的任何字符,请使用象 ’[.n]’ 的模式。
(pattern) 匹配pattern 并获取这一匹配。
(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
(?!pattern) 负向预查,与(?=pattern)作用相反
x|y 匹配 x 或 y。
[xyz] 字符集合。
[^xyz] 负值字符集合。
[a-z] 字符范围,匹配指定范围内的任意字符。
[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。
b 匹配一个单词边界,也就是指单词和空格间的位置。
B 匹配非单词边界。
cx 匹配由x指明的控制字符。
d 匹配一个数字字符。等价于 [0-9]。
D 匹配一个非数字字符。等价于 [^0-9]。
f 匹配一个换页符。等价于 x0c 和 cL。
n 匹配一个换行符。等价于 x0a 和 cJ。
r 匹配一个回车符。等价于 x0d 和 cM。
s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ fnrtv]。
S 匹配任何非空白字符。等价于 [^ fnrtv]。
t 匹配一个制表符。等价于 x09 和 cI。
v 匹配一个垂直制表符。等价于 x0b 和 cK。
w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。
xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。
num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。
n 标识一个八进制转义值或一个后向引用。如果 n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
nm 标识一个八进制转义值或一个后向引用。如果 nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 nm 将匹配八进制转义值 nm。
nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。

匹配中文字符的正则表达式: [u4e00-u9fa5]
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:onkeyup=”value=value.replace(/[^u4E00-u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^u4E00-u9FA5]/g,”))”
用正则表达式限制只能输入全角字符: onkeyup=”value=value.replace(/[^uFF00-uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^uFF00-uFFFF]/g,”))”
用正则表达式限制只能输入数字:onkeyup=”value=value.replace(/[^d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^d]/g,”))”
用正则表达式限制只能输入数字和英文:onkeyup=”value=value.replace(/[W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^d]/g,”))”

=========常用正则式

匹配中文字符的正则表达式: [u4e00-u9fa5]
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配IP地址的正则表达式:/(d+).(d+).(d+).(d+)/g //
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* //OSPHP.COM.Cn开源
匹配网址URL的正则表达式:http://(/[w-]+.)+[w-]+(/[w- ./?%&=]*)?
sql语句:^(select|drop|delete|create|update|insert).*$

1、非负整数:^d+$
2、正整数:^[0-9]*[1-9][0-9]*$
3、非正整数:^((-d+)|(0+))$
4、负整数:^-[0-9]*[1-9][0-9]*$
5、整数:^-?d+$
6、非负浮点数:^d+(.d+)?$
7、正浮点数:^((0-9)+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$
8、非正浮点数:^((-d+.d+)?)|(0+(.0+)?))$
9、负浮点数:^(-((正浮点数正则式)))$
10、英文字符串:^[A-Za-z]+$
11、英文大写串:^[A-Z]+$
12、英文小写串:^[a-z]+$
13、英文字符数字串:^[A-Za-z0-9]+$
14、英数字加下划线串:^w+$
15、E-mail地址:^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$ //OSPHP.COm.CN
16、URL:^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$
或:^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>””])*$
17、邮政编码:^[1-9]d{5}$
18、中文:^[u0391-uFFE5]+$
19、电话号码:^(((d{2,3}))|(d{3}-))?((0d{2,3})|0d{2,3}-)?[1-9]d{6,7}(-d{1,4})?$
20、手机号码:^(((d{2,3}))|(d{3}-))?13d{9}$
21、双字节字符(包括汉字在内):^x00-xff
22、匹配首尾空格:(^s*)|(s*$)(像vbscript那样的trim函数)
23、匹配HTML标记:<(.*)>.*|<(.*) />
24、匹配空行:n[s| ]*r
25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *(‘|”)?(w|\|/|.)+(‘|”| *|>)?
26、提取信息中的邮件地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *(‘|”)?(w|\|/|.)+(‘|”| *|>)?
28、提取信息中的IP地址:(d+).(d+).(d+).(d+)
29、提取信息中的中国手机号码:(86)*0*13d{9}
30、提取信息中的中国固定电话号码:((d{3,4})|d{3,4}-|s)?d{8}
31、提取信息中的中国电话号码(包括移动和固定电话):((d{3,4})|d{3,4}-|s)?d{7,14}
32、提取信息中的中国邮政编码:[1-9]{1}(d+){5}
33、提取信息中的浮点数(即小数):(-?d*).?d+
34、提取信息中的任何数字 :(-?d*)(.d+)? //开源代码OSPhP.COm.CN
35、IP:(d+).(d+).(d+).(d+)
36、电话区号:/^0d{2,3}$/
37、腾讯QQ号:^[1-9]*[1-9][0-9]*$
38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
39、中文、英文、数字及下划线:^[u4e00-u9fa5_a-zA-Z0-9]+$

Spin格式函数

使用实例:

$content = <<{search engine} is good.
EOF;
$content = mass_spinText($content);
echo $content;

Spin格式函数定义:

function mass_spinText($text)
{
$str_arr = explode("}",$text);
$text_new = "";
for ($i=0;$i $match){
$choices = explode("|", $out[1][$id]);
$toFind[]=$match;
$toReplace[]=trim($choices[rand(0, count($choices)-1)]);
}
$text_new = str_replace($toFind, $toReplace, $text);
return $text_new;
}

自定义curl函数

应用实例:

$url = "http://www.baidu.com/";
curl_url($url,"echo_yes","follow_location_yes","use_ssl_no","has_header_no","is_post_no","create_cookie_no","load_cookie_no");

curl_url函数:

function curl_url($url,$if_echo,$follow_location,$use_ssl,$has_header,$is_post,$create_cookie,$load_cookie)
{
global $cookie_file,$post_data,$contents,$header,$curl_info;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($follow_location == "follow_location_yes")
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if ($follow_location == "follow_location_no")
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_HEADER,1);
if ($use_ssl == "use_ssl_yes")
{
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
}
if ($has_header == "has_header_yes")
{
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
}
if ($is_post == "is_post_get" or $is_post == "is_post_post")
{
if ($is_post == "is_post_post")
curl_setopt($ch, CURLOPT_POST, 1);
if ($is_post == "is_post_get")
curl_setopt($ch, CURLOPT_POST, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
if ($create_cookie == "create_cookie_yes" or $load_cookie == "load_cookie_yes")
{
if ($create_cookie == "create_cookie_yes")
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
if ($load_cookie == "load_cookie_yes")
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
}
curl_setopt ($ch, CURLOPT_PROXY,"http://127.0.0.1:8087"); //使用goagent代理
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //超时设置
//curl_setopt($ch, CURLOPT_USERPWD, ":");
$contents = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);
if ($if_echo == "echo_yes")
echo $contents;
}

记录PHP学习点滴