一站式百度SEO排名优化!-找老刘SEO低投入,高转化,精益求精、一丝不苟:旨在提供更好的SEO服务!

首页>>老刘专栏

SEO进阶之正则表达式

首页 2020-12-02 老刘专栏 9 ℃ Tags:


废话不说,直入正题。

什么是正则表达式?

正则表达式通常用来描述或者匹配一系列符合某个句法规则的字符串。比如^Colou?r$ 是一个用来匹配colorcolour这两个字符串的正则表达式。一枚正则表达式由字符和元字符组成。

什么是元字符?

元字符是正则表达式中具有特殊意义的字符。它们是正则表达式的基石。比如[]^(){}$+*等。

正则表达式的元字符:

  1. []

  2. ^

  3. ()

  4. $

  5. +

  6. ?

  7. .

  8. *

  9. |

  10. \

  11. !

1. [] – 这个中括号用来匹配其内部的任何一个单字符,例如:

  • [a] => 匹配一个单字符,它是小写字母a.

  • [ab] => 匹配一个单字符,它是小写字母a或者b.

  • [aB] => 匹配一个单字符,它是小写字母a或者大写字母B.

  • [1B] => 匹配一个单字符,它是数字1或者大写字母B.

  • [Dog] => 匹配一个单字符:它是大写字母D,小写字母o或者小写字母g。

  • [123b] => 匹配一个单字符:它是数字1, 2, 3或小写字母g.

  • [1-3] => 匹配一个单字符,它是数字1, 2或者3。

  • [0-9] => 匹配一个单字符,它是一个数字。

  • [a-d] => 匹配一个单字符,它是小写字母a, b, c或者d。

  • [a-z] => 匹配一个单字符,它是一个小写字母。

  • [A-Z] => 匹配一个单字符,它是一个大写字母。

  • [home.php] => 匹配一个单字符,它是小写字母h,小写字母o,小写字母m,小写字母e,特殊字符.,小写字母p,小写字母h或者小写字母p。

2. ^ – 又叫“脱字符”,用来表示一段正则表达式的开始,例如:

  • ^Colou?r => 匹配一个样本,该样本以Color或者Colour起头。

  • ^Nov(ember)? => 匹配一个样本,该样本以Nov或者November起头。

  • ^elearning*\.html => 匹配一个样本,该样本以elearning.html起头。

  • ^\.php => 匹配一个样本,该样本以任意php文件起头。

  • ^product-price\.php => 匹配一个样本,该样本以product-price.php起头。

脱字符跟随向右开口的中括号表示否定,例如:
  • [^a] => 匹配一个单字符,只要它不是小写字母a。

  • [^B] => 匹配一个单字符,只要它不是大写字母B。

  • [^1] => 匹配一个单字符,只要它是它不是数字1。

  • [^ab] => 匹配一个单字符,只要它不是小写字母a或b。

  • [^aB] => 匹配一个单字符,只要它不是小写字母a或大写字母B。

  • [^1B] => 匹配一个单字符,只要它不是数字1或者大写字母B。

  • [^Dog] => 匹配一个单字符,只要它不是大写字母D,小写字母o或者小写字母g。

  • [^123b] => 匹配一个单字符,只要它是它不是数字1,2,3或者小写字母b。

  • [^1-3] => 匹配一个单字符,只要它不是数字1,2或3。

  • [^0-9] => 匹配一个单字符,只要它不是数字。

  • [^a-z] => 匹配一个单字符,只要它不是小写字母。

  • [^A-Z] => 匹配一个单字符,只要它不是大写字母。

3. () – 圆括号用来匹配字符串,例如:

  • (a) => 匹配字符串a。

  • (ab) => 匹配字符串ab。

  • (dog) => 匹配字符串dog。

  • (dog123) => 匹配字符串dog123。

  • (0-9) => 匹配字符串0-9。

  • (A-Z) => 匹配字符串A-Z。

  • (a-z) => 匹配字符串a-z。

  • (123dog588) => 匹配字符串123dog588。

注意:()还被用来创造和储存变量。如:^(.*)$

4. $ – 用来标记一则表达式或者是一行的完结,例如:

  • Colou?r$ => 匹配一个样本,该样本以Color或者Colour结尾。

  • Nov(ember)?$ => 匹配一个样本,该样本以Nov或者November结尾。

  • elearning*\.html$ => 匹配一个样本,该样本以elearning.html结尾。

  • *\.php$ => 匹配一个样本,该样本以任意php文件结尾。

  • product-price\.php$ => 匹配一个样本,该样本以product-price.php结尾。

5. + – 一次或多次匹配前面的子字符,例如:

  • [a]+ => 一次或多次匹配小写字母a。

  • [dog]+ => 一次或者多次匹配小写字母d,o,或者g。

  • [548]+ => 一次或者多次匹配数字5,4或者8。

  • [0-9]+ => 一次或多次匹配数字。

  • [a-z]+ => 一次或多次匹配小写字母。

  • [^a-z]+ => 一次或者多次匹配非小写字母。

  • [a-zA-z]+ => 匹配任意的大小写字母组合。

  • [^9]+ => 一次或者多次匹配非9的字符。

6. ? – 零次或一次匹配前面的字符,例如:

  • [a]?+ => 零次或一次匹配小写字母a。

  • [dog]? => 零次或者一次匹配小写字母d,o,或者g。

  • [^dog]? => 零次或者一次匹配非小写字母d,o或者g。

  • [0-9]? => 零次或多次匹配数字。

  • [^a-z]? => 零次或多次匹配小写字母。

注意:在正则表达式中使用?表示之前的字母或者字母组可有可无。例如:正则表达式^colou?r$同时匹配color和colour。相似地,正则表达式^Nov(ember)28th?$匹配:nov 28,november 28,Nov 28th和November 28th。

7. . – 匹配非行尾的单字符,例如:

正则表达式Action.,Scene2匹配Action1,Scene2; Action A,Scene2; Action9,Scene2但却不匹配Action10,Scene2或者Action AB,Scene2。

8. * – 以任意次数(包括0次)匹配前面的字符,例如:

正则表达式31*将会匹配3,31,311,3111,31111等。

9. | – 表明逻辑,例如:

正则表达式(His|Her)匹配字符串his或者her。

10. \ – 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用,或一个八进制转义符,例如:

正则表达式^www\.abc\.com$匹配www.abc.com

11.! – 表明逻辑。但不像^(脱字符),它只在规则和条件的开头使用。例如:

  • (!abc) => 匹配非字符串abc。

  • [!0-9] => 匹配非数字的单字符。

  • [!a-z] => 匹配非小写字母的单字符。

一些正则表达式

  • ^(*\.html)$ => 匹配.html前任意个数的字符并将其存入变量。

  • ^dog$ => 匹配字符串dog。

  • ^a+$ => 一次或多次匹配小写字母a。

  • ^(abc)+$ => 一次或多次匹配字符串abc。

  • ^[a-z]+$ => 一次或多次匹配小写字母。

  • ^(abc)*$ => 以任意次数匹配字符串abc。

  • ^a*$ => 以任意次数匹配小写字母a。

问:

找出所有以elearning开头并且包含.html扩展名的文件。
^elearning*\.html$

问:

找出所有的PHP文件。
^*\.php$

mod_rewrite

这是一个用C语言写的模块(功能):mod_rewrite.c。这个模块只能在Apache服务器1.2或之后的版本下工作同时被.htaccess文件执行(这是一个包含文件和文件夹配置指令和规则的ASCII文件)。通过这个模块你可以:

  1. 重写URL

  2. 重定向URL

  3. 解决正则URL问题

  4. 解决热链接问题

  5. 制作定制的403和404页面

  6. 基于IP地址提交内容,益处无穷

配置指令类型

总共有9种配置指令类型:

  1. RewriteEngine

  2. RewriteOptions

  3. RewriteLog

  4. RewriteLogLevel

  5. RewriteLock

  6. RewriteMap

  7. RewriteBase

  8. RewriteRule

  9. RewriteCond

但在这里我们只讨论三种指令:RewriteEngine, RewriteRule和RewriteCond。我至今还没发现其他的指令有什么用。但如果你想,其他的指令也会对SEO有所帮助。

RewriteEngine

这个配置指令用来激活或关闭mod_rewrite模块。

语法:RewriteEngine on/off

默认值:RewriteEngine off

这就是为什么在.htaccess文件中我们要加入下面的代码来激活mod_rewrite模块:

Options +FollowSymLinks

RewriteEngine on
RewriteRule

这个配置指令告诉服务器将给定的语句编译成规则。

语法:Rewrite <pattern> <substitution> [FLAGS]

这里的pattern是一个正则表达式而substitution是一个URL.
FLAG可以是[R][F][NC][QSA][L][OR]等。

  • [R] => 重定向。默认值为302。可以被赋予从300到400的任意数值,例如:

    RewriteRule ^index\.html$/index.php [r=301]
  • [F] => 禁止。经常与连字符-一起使用。这个连字符告诉服务器不要进行任何替代。这个信号告诉服务器不要完成请求,同时返还一条403代码。例如:

    RewriteRule ^product-price\.php$ -[F]
  • [NC] => 它告诉服务器在匹配样本时无视大小写。例如:

    RewriteRule ^him*\.php$[nc]
  • [QSA] => 追加请求字符串(Query String Append)。它告诉服务器将字符串从旧的URL传递到新的。

  • [L] => 最后规则。这个标签告诉服务器不要再处理更多的规则了。

  • [OR] => 逻辑。这个标签用于RewriteCond声明中的逻辑或。

RewriteCond

这个配置指令告诉服务器将一个给定的声明编译成立刻跟进的规则的一个条件。

语法:

这里第一个mod_rewrite将每一个URL和给定的样本进行匹配。如果没有URL符合样本,那么mod_rewrite就会执行下一条规则。如果有一条URL和样本匹配,那么mod_rewrite就会搜索相应的RewriteCond。如果没有相应的RewriteCond存在,那么匹配的URL就会被替代。
如果相应的RewriteCond存在,那么每一条RewriteCond都会以从上到下的顺序被执行。服务器会将每一条RewriteCond的测试字符串和它相应的条件样本进行匹配。如果测试字符串与相应的条件样本不匹配,那么mod_rewrite就会执行下一条规则,否则就处理下一条RewriteCond。当所有的RewriteCond都成功处理完毕时,匹配的URL会被替代。测试字符串可以是:

  1. 简单文本

  2. RewriteRule后方引用

  3. RewriteCond后方引用

  4. 服务器变量

RewriteRule后方引用
形式为$N,这里的N可以是从0到9的任意数字。它用来标记在RewriteRule样本中被创建的变量,例如:

Rewrite ^(.*)$/index.php/$1 [L]

RewriteCond后方引用
形式为%N,这里的N可以是从1到9的任意数字。它用来标记从最后的匹配RewriteCond创建而来的在cond样本中的变量,例如:

RewriteCond %{HTTP_HOST} ^(123\.42\.162\.7)$ 

RewriteCond %1 ^123\.42\.162\.7$ 

RewriteRule .........

服务器变量

语法: % {Variable_Name}

例如:

  1. %{HTTP_HOST} => 这个变量给出服务器信息以及其IP地址。

  2. %{HTTP_USER_AGENT} => 这个变量给出用户操作系统和浏览器信息。

  3. %{QUERY_STRING} => 这个变量返回查询字符串。

  4. %{HTTP_REFERRER} => 这个变量返回来源的URL。

  5. %{REMOTE_ADDR} => 这个变量返回来源的IP地址。

实例

实例一

将所有对media文件夹的页面请求重定向到亲的页面media.html

RewriteRule ^media/$/media.html [r=301,l]
实例二

oldaddress.html页面重定向至newaddress.html页面

RewriteRule ^oldaddress\.html$/newaddress.html [r=301,l]
实例三

将一个网址重定向至另一个网站

Redirect 301 http://www.anotherwebsite.com
实例四

禁止来自IP地址为12.34.56.78的访问者查看product-prices.html页面

RewriteCond %{REMOTE_ADDR} ^12\.34\.56\.78$ 

RewriteRule ^product-prices\.html$/sorry.html -[F]
实例五

abc.com/index.html重定向到www.abc.com

RewriteCond %{REQUEST_URL} ^index\.html$ 

RewriteRule ^(.*)$ http://www.abc.com/$1 [r=301,l]
实例六

阻止来自IP地址为12.34.56.78的访客查看sales-demo文件夹

RewriteCond %{REMOTE_ADDR} ^12\.34\.56\.78$ 

RewriteRule ^sales-demo/$ /sorry.html -[F]
实例七

阻止来自IP地址为12.34.56.78的访客访问你的网站www.abc.com

RewriteCond %{REMOTE_ADDR} ^12\.34\.56\.78$ 

RewriteRule ^.*$/ -[F]
.htaccess

这是一个包含了文件、文件夹和整个网站的配置指令以及规则的ASCII码文件。你能在一个服务器上拥有多个.htaccess文件。事实上每个文件夹和目录都能有一个.htaccess文件。当你将这个文件放置在某一文件夹中时,其中的规则仅对该文件夹及其子文件夹中的文件有效。当你将这个文件放置在根目录时,其中的规则适用于服务器上所有的文件夹和文件。一个有效的.htaccess文件必须包含以下两行代码:

Options +FollowSymLinks 

RewriteEngine on

以上这些正则实例与SEO息息相关,是每一个SEO都应当掌握的基本知识。


搜索
分类
热门标签
  • 首页
  • 电话
  • QQ
  •  
    联系老刘手机
    13524017402
    联系老刘微信
    扫描微信二维码