PHP如何使用正则表达式?解析和代码示例

2021年3月29日17:24:24 发表评论 841 次浏览

通常称为正则表达式(regex)的正则表达式是一系列字符, 以文本字符串的形式描述特殊的搜索模式。它们基本上用于编程世界算法中, 以匹配一些松散定义的模式以实现一些相关任务。有时, 正则表达式被理解为具有模式标记的小型编程语言, 该模式标记使用户可以解析文本字符串。字符的确切顺序事先是不可预测的, 因此正则表达式可帮助你根据模式定义获取所需的字符串。

正则表达式是描述与特定数量的文本匹配的字符串模式的紧凑方式。如你所知, PHP是一种常用于网站创建的开源语言, 它提供了正则表达式功能作为重要工具。与PHP一样, 许多其他编程语言也有自己的正则表达式实现。这也与其他应用程序相同, 它们对具有各种语法的正则表达式都有自己的支持。许多可用的现代语言和工具将正则表达式应用于非常大的文件和字符串。让我们研究一下应用程序中正则表达式的一些优点和用法。

正则表达式的优点和用法:

在许多情况下, 每当在自由文本字段中收集数据时, 开发人员就会遇到问题, 因为大多数编程都处理数据条目。在当今的应用程序编程中, 几乎所有地方都使用了正则表达式。

  • 正则表达式有助于验证程序员感兴趣的文本字符串。
  • 它提供了强大的工具来分析, 搜索模式和修改文本数据。
  • 它有助于搜索特定的字符串模式并以灵活的方式提取匹配结果。
  • 它有助于解析文本文件, 以查找定义的字符序列, 以进行进一步的分析或数据处理。
  • 借助内置的正则表达式功能, 可提供简单易用的解决方案来识别模式。
  • 它有效地节省了很多开发时间, 这些时间都在寻找特定的字符串模式。
  • 它有助于进行重要的用户信息验证, 例如电子邮件地址, 电话号码和IP地址。
  • 它有助于根据搜索结果或输入突出显示文件中的特殊关键字。
  • 它有助于识别特定的模板标签, 并根据需要用实际数据替换这些数据。
  • 正则表达式对于创建识别标签的HTML模板系统非常有用。
  • 正则表达式主要用于浏览器检测, 垃圾邮件过滤, 检查密码强度和表单验证。

我们无法涵盖此主题下的所有内容, 但让我们研究一些主要的正则表达式概念。下表显示了一些正则表达式和与正则表达式模式匹配的相应字符串。

正则表达式 匹配
geeks 字符串"geeks"
^geeks 以"geeks"开头的字符串
geeks 末尾带有"geeks"的字符串。
^geeks$ 在字符串上单独存在"geeks"的字符串。
[abc] a, b或c
[a-z] 任何小写字母
[^ A-Z] 任何不是大写字母的字母
(gif | png) " gif"或" png"
[a-z] + 一个或多个小写字母
^ [a-zA-Z0-9] {1, } $ 任何带有至少一个数字或一个字母的单词
([ax])([by]) ab, ay, xb, xy
[^ A-Za-z0-9] 除字母或数字以外的任何符号
([A-Z] {3} | [0-9] {5}) 匹配三个字母或五个数字

注意:可以通过应用一些基本的正则表达式规则来创建复杂的搜索模式。正则表达式甚至使用了许多算术运算符(例如+, ^, -)来创建少量复杂的模式。

正则表达式运算符:让我们研究一下PHP正则表达式中的一些运算符。

操作符 描述
^ 它表示字符串的开始。
$ 它表示字符串的结尾。
. 它表示几乎任何单个字符。
() 它表示一组表达式。
[] 它找到一个字符范围, 例如[xyz]表示x, y或z。
[^] 它查找不在范围内的项目, 例如[^ abc]表示NOT a, b或c。
–(破折号) 它查找给定项目范围内的字符范围, 例如[a-z]表示a到z。
| (管) 它是逻辑或, 例如x | y表示x或y。
? 它表示零或前一个字符或项目范围之一。
* 它表示零个或多个先前字符或项目范围。
+ 它表示一个或多个先前的字符或项目范围。
{n} 它恰好表示前一个字符或项目范围的n次, 例如n {2}。
{n, } 它表示前一个字符或项目范围至少n次, 例如n {2, }。
{n, m} 它表示至少n次但不超过m次, 例如n {2, 4}表示n的2到4。
\ 它表示转义字符。

正则表达式中的特殊字符类:让我们研究一下正则表达式中使用的一些特殊字符。

特殊字符 含义
\n 它表示一个新行。
\r 它表示回车。
\t 它表示一个标签。
\v 它表示垂直制表符。
\f 它表示换页。
\ xxx 它表示八进制字符xxx。
\ xhh 它表示十六进制字符hh。

速记字符集:让我们研究一些可用的速记字符集。

符号 含义
\s 匹配空格字符, 例如空格, 换行符或制表符。
\d 匹配0到9之间的任何数字。
\w 匹配单词字符, 包括所有大小写字母, 数字和下划线。

预定义函数或正则表达式库:让我们研究一下PHP中用于正则表达式的预定义函数的快速备忘单。 PHP为程序员提供了许多有用的函数来使用正则表达式。

下面列出的内置函数区分大小写。

函数 定义
preg_match() 此函数针对某些字符串搜索特定的模式。如果模式存在, 则返回true, 否则返回false。
preg_match_all() 此函数针对字符串搜索所有出现的字符串模式。此功能对于搜索和替换非常有用。
ereg_replace() 此函数搜索特定的字符串模式, 并用替换字符串(如果找到)替换原始字符串。
eregi_replace() 如果搜索模式不区分大小写, 则该函数的行为类似于ereg_replace()。
preg_replace() 如果可以在模式字符串和替换字符串中使用正则表达式, 则此函数的行为类似于ereg_replace()函数。
preg_split() 该函数的行为类似于PHP split()函数。它使用正则表达式将字符串拆分为参数。
preg_grep() 此函数搜索与正则表达式模式匹配的所有元素, 并返回输出数组。
preg_quote() 此函数在与正则表达式匹配的每个字符前面加上字符串和引号。
ereg() 此函数搜索由模式指定的字符串, 如果找到则返回true, 否则返回false。
eregi() 如果搜索不区分大小写, 则此函数的行为类似于ereg()函数。

注意:

  • 默认情况下, 正则表达式区分大小写。
  • 在PHP中, 单引号内的字符串和双引号内的字符串之间存在区别。前者将按字面意义处理, 而对于双引号中的字符串, 则意味着将打印变量的内容, 而不仅仅是打印其名称。

范例1:

<?php
  
// Declare a regular expression
$regex = '/^[a-zA-Z ]*$/' ;
  
// Declare a string
$nameString = 'Sharukh khan' ;
  
// Use preg_match() function to
// search string pattern
if (preg_match( $regex , $nameString )) {
     echo ( "Name string matching with"
         . " regular expression" );
}
else {
     echo ( "Only letters and white space"
         . " allowed in name string" ); 
}
  
?>

输出如下:

Name string matching with regular expression

范例2:

<?php
  
// Declare a regular expression
$regex = "/<b>(.*)<\/b>/U" ;
  
// Declare a string
$inputString = "Name: <b>John</b> Position: <b>Developer</b>" ;
  
// Use preg_match_all() function to perform
// a global regular expression match
preg_match_all( $regex , $inputString , $output );
  
echo $output [0][0]. " <br> " . $output [0][1]. "\n" ;
  
?>

输出如下:

John
Developer

范例3:

<?php
  
// Declare a regular expression
$regex = "([0-9]+)" ;
  
// Declare a string
$original = "Completed graduation in 2004" ;
$replaceWith = "2002" ;
   
// Use ereg_replace() function to search a
// string pattern in an other string
$original = ereg_replace ( $regex , $replaceWith , $original ); 
      
// Display result
echo $original ;
   
?>

输出如下:

Completed graduation in 2002

范例4:

<?php
<?php
  
// Declare a string
$ip = "134.645.478.670" ; 
  
// Declare a regular expression
$regex = "/\./" ;
  
// Use preg_split() function to
// convert a given string into
// an array
$output = preg_split ( $regex , $ip ); 
  
echo "$output[0] <br>" ;
echo "$output[1] <br>" ;
echo "$output[2] <br>" ;
echo "$output[3] <br>" ;
  
?>

输出如下:

134
645
478
670

元字符:正则表达式中使用两种字符, 它们是:正则字符和元字符。常规字符是指具有'文字'含义和元字符是那些具有'特别'正则表达式中的意思。

元字符 描述 例子
. 它匹配换行以外的任何单个字符。 /./匹配具有单个字符的字符串。
^ 它匹配字符串的开头。 / ^ geeks /匹配以geeks开头的任何字符串。
$ 它与字符串结尾处的字符串模式匹配。 / com $ /匹配以com结尾的字符串, 例如google.com等。
* 它匹配零个或多个字符。 / com * /匹配通勤, 计算机, 入侵等
+ 它与前面的字符匹配至少出现一次。 例如/ z + oom /匹配缩放。
\ 它用于在正则表达式中保留元字符。 /google\.com/会将点视为文字值, 而不是元字符。
- 它匹配小写字母。 geeks
A-Z 它与大写字母匹配。 geeks
0-9 它匹配0到9之间的任何数字。 / 0-5 /匹配0、1、2、3、4、5
[…] 它与字符类匹配。 / [pqr] /匹配pqr

其他例子:

正则表达式 含义
^[.- a-z0-9A-Z] 它匹配带点, 破折号和任何小写字母, 0到9之间的数字以及大写字母的字符串。
+@[a-z0-9A-Z] 它在开始时将字符串与@符号匹配, 后跟任何小写字母, 0到9之间的数字以及大写字母。
+\.[a-z]{2, 6}$/ 它会转义该点, 然后将其与任何小写字母的字符串匹配, 最后将字符串长度在2到6之间。

注意:

  • 元字符在正则表达式模式匹配解决方案中非常强大。它处理许多复杂的模式处理。
  • 每个不是元字符的字符都绝对是常规字符。
  • 每个常规字符自己都匹配相同的字符。

POSIX正则表达式:PHP中的某些正则表达式就像算术表达式一样, 称为POSIX正则表达式。有时, 通过在正则表达式中组合各种元素或运算符来创建复杂的表达式。最基本的正则表达式是匹配单个字符的正则表达式。

让我们看一些POSIX正则表达式。

正则表达式 含义
[0-9] 匹配从0到9的数字。
[a-z] 它匹配从a到z的任何小写字母。
[A-Z] 它匹配从A到Z的任何大写字母。
[a-Z] 它匹配任何小写字母a到大写字母Z。
[:lower:] 它匹配任何小写字母。
[:UPPER:] 它匹配任何大写字母。
[:alpha:] 它匹配所有字母字符或a-z和A-Z中的字母。
[[:alpha:]] 它匹配任何包含字母字符或字母的字符串。
[:alnum:] 它匹配所有字母数字字符, 即所有数字(0-9)和字母(a-z A-Z)。
[[:alnum:]] 它匹配任何包含字母数字字符和数字的字符串。
[:digit:] 它匹配从0到9的所有数字。
[[:digit:]] 它匹配任何包含从0到9的数字的字符串。
[:xdigit:] 它匹配所有十六进制数字。
[:punct:] 它匹配所有标点符号。
[:blank:] 它匹配空格和制表符等空白字符。
[:space:] 它匹配所有空格字符, 例如换行符。
[[:space:]] 它匹配任何包含空格的字符串。
[:cntrl:] 它匹配所有控制字符。
[:graph:] 它匹配除空格和控制字符之外的所有可见或打印字符。
[:print:] 它匹配所有打印字符和控制字符以外的空格。
[:word:] 它匹配所有单词字符, 例如数字, 字母和下划线。

正则表达式中的量词:量词是特殊字符, 用于指示实例的数量, 频率或数量, 或出现在方括号中的字符或一组字符。它们也被称为贪婪和懒惰的表达。让我们研究量词的一些概念和示例。

量词 含义
a+ 它匹配包含至少一个a的字符串。
a* 它匹配包含零个或多个a的字符串。
a? 它匹配包含零或一个a的任何字符串。
斧头} 它与字母" a"匹配x次。
a {2, 3} 它匹配包含两个或三个a的任何字符串。
a2, } 它匹配包含至少两个a的任何字符串。
a2} 它与包含恰好两个a的任何字符串匹配。
a {, y} 它匹配包含不超过y个数字的任何字符串。
a$ 它匹配任何以" a"结尾的字符串。
^a 它匹配任何以" a"开头的字符串。
[^a-zA-Z] 它匹配任何没有从a到z和A到Z的字符的字符串模式。
a.a 它匹配任何包含a的字符串模式, 然后是任何字符, 然后是另一个a。
^.{3}$ 它匹配具有三个字符的任何字符串。

注意:

  • 表达式内的$字符将与目标字符串的末尾匹配。
  • 正则表达式中的*, ?, +符号表示出现字符的频率。如果发生零次或多次, 则零次或一次, 一次或多次。
  • 表达式中的^字符将与目标字符串的开头匹配。
  • 的。元字符匹配换行符以外的任何单个字符。

众所周知的正则表达式引擎:

  • Regexp
  • RegexBuddy

结论:正则表达式是一种模式, 它以特定模式描述某些字符串文本, 或者被定义为用单行表示的模式匹配算法。正则表达式在编程世界中对于验证检查和识别特定模板非常有用。 PHP提供了许多支持正则表达式的内置函数。元字符有助于创建复杂的模式。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: