php用正则表达抓取网页中文章(常用的nginx正则表达式^:匹配输入字符串的路径地址地址)

优采云 发布时间: 2022-01-15 03:16

  php用正则表达抓取网页中文章(常用的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)根据参数匹配跳转

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线