php用正则表达抓取网页中文章(常用的nginx正则表达式^:匹配输入字符串的路径地址地址)
优采云 发布时间: 2022-01-15 03:16php用正则表达抓取网页中文章(常用的nginx正则表达式^:匹配输入字符串的路径地址地址)
常用的nginx正则表达式
^ : 匹配输入字符串的开头
$:匹配输入字符串的结尾
*:匹配前面的字符零次或多次
+:匹配前面的字符一次或多次
?:匹配前面的字符零次或一次
. : 匹配除 "\n" 之外的任何单词。如果要匹配 "\n" 字符串,请使用 [.\n] 之类的模式
\:将后面的字符标记为特殊字符或文字或反向引用
\d : 匹配纯数字 [0-9], \s: 空格 \w: 任何单个,包括下划线 [A-Za-z0-9]
{n}:重复 n 次
{n,} :重复 n 次或更多
{n,m}:重复 n 到 m 这个
[ ] : 定义匹配的字符转置
[ c ] : 匹配单个字符 c
[az]:匹配 az 的任何小写字符
[A-Za-z0-9]:匹配所有大小写字符或数字
() : 表达式的开始和结束位置
| : OR 运算符
从功能上看,rewrite和location似乎有点类似,都可以实现跳转。主要区别在于rewrite改变了获取同域名下资源的路径,而location是一对用于控制访问或反向代理的类路径。可以proxy_pass到其他机器吗
rewrite 重写访问域名中的 URL 路径地址
location 对访问路径进行访问控制或代理转发
地点
位置大致可以分为三类:
完全匹配:位置 = / {...}
一般匹配:location/{...}#最长匹配原则(如果有屁匹配最长的会选择最长的)
正则匹配:location ~ / {...}
位置常用匹配选项:
= :对普通字符进行精确匹配,即精确匹配
^~ :对普通字符进行精确匹配,即精确匹配。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~* :!~: 区分大小写的匹配否定。
!~* :不区分大小写的匹配否定。
位置匹配优先级
首先是完全匹配=
二是前缀匹配(匹配后停止搜索,直接用这个!)
后跟按照文件中的顺序进行正则匹配,~或~*
然后匹配前缀匹配,不做任何修改(正常匹配)
最后传给“/”(万能匹配)
位置示例说明:
1、位置 = / {}
=。要完全匹配/,主机名后面不能跟任何字符串,比如访问/和/data,那么/匹配,/data不匹配。例如 location = /abc,它只匹配 /abc、/abc/ 或 /abcd 不匹配。如果位置 /abc,它匹配 /abc、/abcd/ 并且还匹配 /abc/。
(2) 位置 / {}
因为所有地址都以1开头,所以这条规则会匹配访问/和/data等所有请求,那么1会匹配,/data也会匹配,但是如果后面是正则表达式,会匹配最长的字符串第一个(最长的字符串)。长比赛)
(3) location /documents/ {} 匹配任何以/documents/开头的地址,匹配后会继续搜索其他位置,只有当其他位置后面的正则表达式不匹配时才会使用。这个
(4) location /documents/abc {} 匹配任何以 /documents/abc 开头的地址。匹配后会继续搜索其他位置。只有当其他位置后面的正则表达式不匹配时,将使用这个
(5) 位置 ^~ /images/ {}
匹配任何以/images/开头的地址,匹配后停止搜索正则,使用这个
(6) 位置 ~* . (gifljpg ljpeg)$ {}
匹配所有以 gif、jpg 或 jpeg 结尾的请求,但是 /images/ 下的所有请求都会被位置 ^~ /images/ 处理,因为 ^~ 具有更高的优先级,因此无法达到此规则
(7) 位置 /images/abc {}
最长的字符匹配 /images/abc,优先级最低。如果继续搜索其他位置,会发现^~和~存在
(8) 位置 ~ /images/abc {}
以 /images/abc 开头的匹配,优先级次之,仅当 location ^~ /images/ 被删除时,才会使用此条目
(9) 位置 /images/abc/1.html {}
匹配 /images/abc/1.html 文件,如果与常规位置 ~/images/abc/1.html 相比,常规优先级更高
优先级总结:
(location = 全路径) > (location ^~path) > (location ~,~*正则) > (location 部分起始路径) > (location /)
位置匹配
先看优先级:Precise > Prefix > Regular > General > General
优先级是一样的:正则看上下顺序,上面的优先级:一般匹配看长度,最长匹配优先级是精确,前缀,正则,一般不匹配,最后看一般匹配。
在实际网站的使用中,至少定义了三个匹配规则:
#第一条强制规则
直接匹配网站的根,通过域名访问网站的主页更频繁。使用这个会加快处理速度,比如官网。可以是静态首页,也可以直接转发到后台应用服务器
location = / {
root html;
index index.html index.html;
}
#第二条强制规则是处理静态文件请求,这是nginx作为http服务器的强项。有两种配置方式,目录匹配或后缀匹配,任选其一或一起使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三条规则是一般规则。例如,用于将带有 .php 和 .jsp 后缀的动态请求转发到后端应用服务器。默认情况下,非静态文件请求是动态请求。
location / {
proxy_pass http://tomcat_server;
}
改写
重写功能是利用nginx提供的全局变量或者自己设置的变量,结合正则表达式和标签位来实现URL的重写和重定向。
例如:更改域名后需要保留旧域名跳转到新域名,网页更改时跳转到新页面,网站防盗链等等。
改写。只能放在server{}、location{}、if{}中,默认只能作用于域名后面的字符串,除了传入的参数,
例如 http:L //abc/bbs/index.php?a=1&b=2 只重写 /abc/bbs/index.php。
重写跳转实现:
nginx:ngx http rewrite_模块模块支持url重写和if条件判断,但不支持else跳转:从一个位置跳转到另一个位置,循环最多可以执行10次,之后nginx会返回500错误
PCRE 支持:Perl 兼容的正则表达式语法规则匹配
覆盖模块设置指令:创建新变量并设置其值
重写执行顺序如下:
(1) 在服务器块内执行重写指令。
(2) 执行位置匹配。
(3) 在选定位置执行重写命令。
语法格式: rewrite [flag];
regex:表示正则匹配规则。
replacement:表示跳转后的内容。
flag:表示rewrite支持的flag标记。
重写跳跃场景:
调整用户浏览的网址,使其看起来更规范,符合开发和生产
人员的需求。
为了让搜索引擎更好地搜索网站内容和用户体验,公司将
将动态 URL 地址伪装成静态地址提供服务。
网站改成新域名后,让旧访问跳转到新域名。比如访问京东的都会跳转。
服务器端的一些业务调整,比如基于特殊变量、目录、客户端信息的URL调整。
###flag 标志说明 ###
last :本规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中。
break :该规则匹配后终止,不再匹配任何后续规则。一般用于定位。
redirect:返回一个302临时重定向,浏览器地址会显示重定向后的URL地址。
永久:返回301永久重定向,浏览器地址栏会显示重定向后的URL。
重写示例:
(1)根据域名重定向
现在公司老域名业务需求发生变化,需要更换新域名,但是老域名不能取消,需要跳转到新域名,vim /usr/local/nginx/conf /nginx.conf
server {
listen 80;
server_nameWWw.kgc.com; #域名修改
charset utf-8; #编码格式
access_ 1og /var/log/nginx/www.kgc.com-access.log; #日志修改
location / { #添加域名重定向
if ($host = 'WWW.kgc.com') { #$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/(.*)$ http://www.benet.com/$1 permanent; #$1为 正则匹配的内容,即“域名/"之后的字符串
}
root html;
index index.html index.htm;
}
}
echo "192.168.80.10 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问http://www.kgc.com/test/1.html (虽然这个请求内容是不存在的)
会跳转到www.benet.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。
(2)基于客户端IP的访问跳转
今天公司新版业务上线,要求所有IP访问任何内容显示,固定维护页面,只有公司IP:192.168.80. 10访问是正常的。
vim /usr/local/nginx/conf /nginx.conf
server {
server_nameWWw.kgc.com; #域名修改
charset utf-8; #编码格式
access_ 1og /var/log/nginx/www.kgc.com-access.log; #日志修改
#设置是否合法的IP标记
set $rewrite true; #设置变量$rewrite,变量值为boole值true
#判断是否为合法IP
if ($remote_addr = "192.168.80.10"){ #当客户端IP为192.168.80.10时,将变量值设为false,不进行重写
set $rewrite false;
}
#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite = true) { #当变量值为true时,进行重写
rewrite (.+) /weihu.html; #将域名后边的路径重写成/weihu. html,例如www. kgc.com/weihu.html
}
location = /weihu.html {
root /var/ www/html; #网页返回/var/www/ html/weihu. html的内容
}
location / {
root html;
index index.html index.htm;
}
}
(3)基于旧域名,跳转到新域名后跟目录
现在访问了,现在这个域名下的访问需要跳转到http:L //bbs/post
vim /usr/1ocal/nginx/conf/nginx.conf
server {
listen 80;
server_namebbs.kgc.com; #域名修改
charset utf-8;
access_1og /var/1og/nginx/WWW.kgc.com-access.log;
#添加
location /post {
rewrite (.+) http://www.kgc.com/bbs$1 permanent; #这里的$1为位置变量,代表/post
}
location / {
root html;
index index.html index.htm;
}
}
mkdir -p /usr/local/nginx/html/bbs/post
echo "this is 1.html" >> /usr/1ocal/nginx/html/bbs/post/1 . html
echo "192.168.80.10 bbs.kgc.com"
systemctl restart nginx
使用浏览器访问http://bbs.kgc.com/post/1.html跳转到http://www. kgc.com/bbs/post/1.html
(4)根据参数匹配跳转