目录
1.int preg_match(string $pattern,string $subject[,array $matches])
2. int preg_match_all(string $pattern,$string $obj[,array $matches])
0x00 正则表达式
正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具。定义一种规则去匹配符合规则的字符串。
正则表达式可以用来:
- 验证字符串是否匹配指定特征
- 用来查找字符串
- 用来替换
正则表达式由普通字符和元字符组成
正则表达式在线测试: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 匹配的结果,字符串中符合pattern的部分
该函数返回值为int类型,即如果匹配成功就返回1,如果匹配失败就返回0
<?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);
?>