PHPDay0F:正则表达式,CURL

目录

0x00 正则表达式

0x01 常用正则表达式总结

0x02 贪婪模式和非贪婪模式

0x03 PHP中使用正则表达式

1.int preg_match(string $pattern,string $subject[,array $matches])

2. int preg_match_all(string $pattern,$string $obj[,array $matches])

0x04PHP扩展库CURL


0x00 正则表达式

正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具。定义一种规则去匹配符合规则的字符串。

正则表达式可以用来:

  1. 验证字符串是否匹配指定特征
  2. 用来查找字符串
  3. 用来替换

正则表达式由普通字符和元字符组成

正则表达式在线测试:https://tool.oschina.net/regex

普通字符符:字母、数字、下划线以及没有被定义特殊意义的标点符号都是普通字符

元字符:

字符集合:

可以匹配多个字符其中任意一个字符的正则表达式,虽然是“多个字符”但是每次只能匹配一个

字符集合 说明
. 除\n之外的任意一个字符
\w 可以匹配任意一个字母、数字、下划线[a-zA-Z0-9_]
\W 匹配\w的补集
\d [0-9_]
\D \d的补集
\s 空格,制表符,换页符
\S \s的补集
[:alpha:] 任何一个字母
[:^alpha:] [:alpha:]的补集

量词(匹配次数限定符):

量词 说明
{n} 表达式固定重复n次
{m,n} 表达式至少重复m次,最多重复n次,尽可能多匹配
{m,} 至少m次,最多不限,尽可能多匹配
尽可能匹配1次,也可以不匹配
+ 尽可能多匹配,最少匹配1次
* 表达式尽可能多匹配,最少可以不匹配
   
   
   

字符边界:

本身不匹配任何字符,只对字符边界和字符间缝隙附加条件的表达式

边界条件 说明
^ 当前位置必须是文本开始位置
$ 当前位置必须是文本结束位置
\b 当前位置的左右两侧,只能有一侧是字母数字或者下划线

其他常用的字符:

使用竖线‘|’分隔多段表达式,整个表达式可以匹配其中的任意一段

用括号进行分组 ()

转义 \ ,例如想要匹配. 那么 \. 就可以匹配点

[abc]同a|b|c

[a-z] 匹配a-z的字母

[^a-z] [a-z]的补集

0x01 常用正则表达式总结

匹配用户名长度6-10数字字母下划线:^\w{6,10}$

匹配手机号码:^1[345678](\d{9})$

匹配QQ:^[1-9]\d{4,11}$

匹配Email地址:\w+@[a-zA-Z0-9]+\..+

匹配url地址:[a-zA-z]+://\S*

0x02 贪婪模式和非贪婪模式

贪婪匹配:正则表达式一般趋向于最大长度匹配

非贪婪匹配:匹配到结果就好,尽可能少的匹配

默认为贪婪匹配;在量词之后加上一个?就是非贪婪匹配

0x03 PHP中使用正则表达式

1.int preg_match(string $pattern,string $subject[,array $matches])

解释:php regex match

$pattern 正则表达式 在php中正则表达式必须用两个/给包围起来

$subject  要匹配的字符串

$matches 匹配的结果

<?php
$str = 'hello123world';
$pattern = '/^.+?(\d+).+$/';
$ret = preg_match($pattern,$str,$result);
var_dump($ret);
var_dump($result);

?>

结果:

int(1) array(2) { [0]=> string(13) "hello123world" [1]=> string(3) "123" }

爬千库网的图片

复习:

$string file_get_contents($string url) 可以获得网页的源代码

2. int preg_match_all(string $pattern,$string $obj[,array $matches])

@匹配所有符合正则表达式的字符串

@返回值为匹配到的个数

@matches是匹配到的结果,是一个二维数组

<?php
function showPicture($url){
	$str=file_get_contents($url);
	//<img src="//bpic.588ku.com/element_banner/20/20/01/c3e4d8f73e3889b8fda7baf21201a915.gif" title="视频·吉祥金鼠年" alt="视频·吉祥金鼠年">
	//^<img.+?src="(.+)">$
	$p = '/<img.+?lazysrc="(.+?)".+?>/';
	preg_match_all($p,$str,$result);
	foreach($result[1] as $r){
		echo "<img src=$r height='200' width='100'>";
	}
}
//$url = "https://www.shunvi.com/meitu/8688_3.html#p";
//showPicture($url);
for($page =8688;$page < 8690;$page++){
for($i=2;$i<30;$i++){
	$url ="https://www.shunvi.com/meitu/$page"."_$i.html#p";
	showPicture($url);
	
}
}
?>

0x04PHP扩展库CURL

1.确认curl扩展已经打开.

php.ini中extension=php_curl.dll

2.查看是否开启

phpinfo();

使用curl:

1.初始化

resource curl_init([string $url=NULL]):

初始化新的会话,返回curl的句柄,供curl_setopt(),curl_exec()和curl_close()函数使用

2.设置变量

bool curl_setopt(resource $ch,int $option,mixed $value);

$ch:资源句柄

$option: 设置哪个变量

CURLOPT_URL 表示设置url

CURLOPT_RETURNTRANSFER 当该属性设置为true时,获取的页面信息将不会输出,而是以字符串的形式作为curl_exec的返回值返回

CURLOPT_FOLLOWLOCATION 当该属性设置为true时,脚本会跟随请求页面的跳转而跳转

CURLOPT_COOKIEJAR  连接结束后,比如,调用 curl_close 后,保存 cookie 信息的文件。

$value:设置的值为多少

为curl会话设置选项

3.执行获取结果

mixed curl_exec(resource $ch);

4.释放资源

void curl_close(resource $ch)

关闭curl会话并释放所有资源,curl句柄ch也会被删除。

<?php
    $url = "www.baidu.com";
    $h_curl=curl_init();
    curl_setopt($h_curl,CURLOPT_URL,$url);
    curl_setopt($h_curl,CURLOPT_RETURNTRANSFER,true)
    $ret = curl_exec($h_curl);
    curl_close($h_curl)
?>

以上操作默认发送get请求

0x05curl模拟post请求

CURLOPT_POST

true时会发送post请求,类型为:application/x-www/form-urlencoded.是HTML表单提交时最常见的一种

CURLOPT_POSTFIELDS:

feild就是域,字段的意思。因为post请求一般要发送数据。

用一个数组将数据保存起来,然后将数组设置为CURLOPT_POSTFIELDS的值。

这个数组就会被post请求给发送过去

数据可以写成数组的形式,也可以写成字符串的形式,不同数据之间用&连接

例如:$data = "name=liming&pwd=12313";

模拟用户登录实战:

注意:一般情况下,登录页面都会保存SESSION信息,而session值的存取是以cookie为基础的,所以在post请求的时候,不仅仅要传递post参数,而且让请求报文自动携带请求页面产生的cookie信息。

<?php
   
function login($url,$data){
    $h_curl=curl_init();
    curl_setopt($h_curl,CURLOPT_URL,$url);//设置post请求的网址为www.baidu.com
    curl_setopt($h_curl,CURLOPT_RETURNTRANSFER,true)//页面信息作为函数返回值返回
    curl_setopt($h_curl,CURLOPT_POST,true);//设置以post的方式的请求
    curl_setopt($h_curl,CURLOPT_POSTFIELDS,$data);//设置post请求的数据字段
    curl_setopt($h_curl,CURLOPT_FOLLOWLOCATION,ture);//设置脚本页面跟随请求页面跳转
    curl_setopt($h_curl,CURLOPT_COOKIEJAR,'cookie.txt');//设置post请求携带cookie值,并将被请求页面的产生的cookie存到该脚本所在文件夹的cookie.txt(如果没有该文件,自动创建)中。
    $ret = curl_exec($h_curl);//执行
    echo $ret;//显示返回值
    curl_close($h_curl)//释放资源
}

function order($url){
    $h_curl=curl_init();
    curl_setopt($h_curl,CURLOPT_URL,$url);//设置post请求的网址为www.baidu.com
    curl_setopt($h_curl,CURLOPT_RETURNTRANSFER,true)//页面信息作为函数返回值返回
    curl_setopt($h_curl,CURLOPT_FOLLOWLOCATION,ture);//设置脚本页面跟随请求页面跳转
    curl_setopt($h_curl,CURLOPT_COOKIEFILE,'cookie.txt');//将cookie.txt中存的cookie值
带着请求该页面
    //curl_setopt($h_curl,CURLOPT_COOKIEFILE,'cookie名=cookie值')//如果你直接指导cookie键值对,也可以这样发过去。多个cookie键值对之间用;隔开
    $ret = curl_exec($h_curl);//执行
    echo $ret;//显示返回值
    curl_close($h_curl)//释放资源

}
 $url = "www.baidu.com";
 $data = ['name'=>'xiaoming','pwd'=>'123456'];
 login($url,$data);
 order("www.baidu.com/order.php")//请求订单页面

?>

0x05 CURLFile类模拟文件上传

php版本高于5.5时,curl文件上传必须使用CurlFile类

<?php
    $obj = new CURLFile('./index.php');
    $obj->setMimeType('image/png');
    $obj->setPostFilename('123.png');
    $data['img']=$obj;

    $data['username']='xidian';
    $data['pwd'] ='123213';
    $url ="http://localhost:8888/PictureUpload/upload.php";
    $url2="http://59.63.200.79:8002/a/upload_file.php";
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_HEADER,false);
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $ret = curl_exec($ch);
    var_dump($ret);
    curl_close($ch);

?>
发布了156 篇原创文章 · 获赞 19 · 访问量 8938

猜你喜欢

转载自blog.csdn.net/weixin_43415644/article/details/104047485