首页技术php正则匹配?php正则输出

php正则匹配?php正则输出

编程之家2026-06-05910次浏览

其实php正则匹配的问题并不复杂,但是又很多的朋友都不太了解php正则输出,因此呢,今天小编就来为大家分享php正则匹配的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

php正则匹配?php正则输出

求一条php做的正则表达式

PHP中的正则式使用

PHP被大量的应用于Web的后台CGI开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就会出现问题,比如说某人的生日是”2月30日”!那应该怎么样来检验暑假是否正确呢?在PHP中加入了正则表达式的支持,让我们可以十分方便的进行数据匹配。

2什么是正则表达式:

简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。

在某个Linux网站上面有这样的话:”如果你问一下Linux爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。”

正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……

php正则匹配?php正则输出

3正则表达式的基本语法:

一个正则表达式,分为三个部分:分隔符,表达式和修饰符。

分隔符可以是除了特殊字符以外的任何字符(比如”/!”等等),常用的分隔符是”/”。表达式由一些特殊字符(特殊字符详见下面)和非特殊的字符串组成,比如”[a-z0-9_-]+@[a-z0-9_-.]+”可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子:

/hello.+?hello/is

上面的正则表达式”/”就是分隔符,两个”/”之间的就是表达式,第二个”/”后面的字符串”is”就是修饰符。

在表达式中如果含有分隔符,那么就需要使用转义符号”",比如”/hello.+?/hello/is”。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要”"来转义,比如”d”代表全体数字。

php正则匹配?php正则输出

4正则表达式的特殊字符:

正则表达式中的特殊字符分为元字符、定位字符等等。

元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。元字符本身是一个个单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。

元字符:

大括号:大括号用来精确指定匹配元字符出现的次数,例如”/pre{1,5}/”表示匹配的对象可以是”pre”、”pree”、”preeeee”这样在”pr”后面出现1个到5个”e”的字符串。或者”/pre{,5}/”代表pre出现0此到5次之间。

加号:”+”字符用来匹配元字符前的字符出现一次或者多次。例如”/ac+/”表示被匹配的对象可以是”act”、”account”、”acccc”等在”a”后面出现一个或者多个”c”的字符串。”+”相当于”{1,}”。

星号:”*”字符用来匹配元字符前的字符出现零次或者多次。例如”/ac*/”表示被匹配的对象可以是”app”、”acp”、”accp”等在”a”后面出现零个或者多个”c”的字符串。”*”相当于”{0,}”。

问号:”?”字符用来匹配元字符前的字符出现零次或者1次。例如”/ac?/”表示匹配的对象可以是”a”、”acp”、”acwp”这样在”a”后面出现零个或者1个”c”的字符串。”?”在正则表达式中还有一个非常重要的作用,即”贪婪模式”。

还有两个很重要的特殊字符就是”[ ]“。他们可以匹配”[]“之中出现过的字符,比如”/[az]/”可以匹配单个字符”a”或者”z”;如果把上面的表达式改成这样”/[a-z]/”,就可以匹配任何单个小写字母,比如”a”、”b”等等。

如果在”[]“中出现了”^”,代表本表达式不匹配”[]“内出现的字符,比如”/[^a-z]/”不匹配任何小写字母!并且正则表达式给出了几种”[]“的默认值:

[:alpha:]:匹配任何字母

[:alnum:]:匹配任何字母和数字

[:digit:]:匹配任何数字

[:space:]:匹配空格符

[:upper:]:匹配任何大写字母

[:lower:]:匹配任何小写字母

[:punct:]:匹配任何标点符号

[:xdigit:]:匹配任何16进制数字

另外下面这些特殊字符在转义符号”"转义后代表的含义如下:

s:匹配单个的空格符

S:用于匹配除单个空格符之外的所有字符。

d:用于匹配从0到9的数字,相当于”/[0-9]/”。

w:用于匹配字母,数字或下划线字符,相当于”/[a-zA-Z0-9_]/”。

W:用于匹配所有与w不匹配的字符,相当于”/[^a-zA-Z0-9_]/”。

D:用于匹配任何非10进制的数字字符。

.:用于匹配除换行符之外的所有字符,如果经过修饰符”s”的修饰,”.”可以代表任意字符。

利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如”/d0000/”利用上面的正则表达式可以匹配万以上,十万一下的整数字符串。

定位字符:

定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置进行描述。

^:表示匹配的模式出现在匹配对象的开头(和在”[]“里面不同)

$:表示匹配的模式出现在匹配对象的末尾

空格:表示匹配的模式出现在开始和结尾的两个边界之一

“/^he/”:可以匹配以”he”字符开头的字符串,比如hello、height等等;

“/he$/”:可以匹配以”he”字符结尾的字符串即she等;

“/ he/”:空格开头,和^的作用一样,匹配以he开头的字符串;

“/he/”:空格结束,和$的作用一样,匹配以he结尾的字符串;

“/^he$/”:表示只和字符串”he”匹配。

括号:

正则表达式除了可以用户匹配,还可以用括号”()”来记录需要的信息,储存起来,给后面的表达式读取。比如:

/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/

就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为username@server.com之类的),在后面如果想要读取记录下来的字符串,只是需要用”转义符+记录的次序”来读取。比如”1〃就相当于第一个”[a-zA-Z0-9_-]+”,”2〃相当于第二个([a-zA-Z0-9_-]+),”3〃就是第三个(.[a-zA-Z0-9_-])。但是在PHP中,”"是一个特殊的字符,需要转义,所以”"到了PHP的表达式中就应该写成”1〃。

其他特殊符号:

“|”:或符号”|”和PHP里面的或一样,不过是一个”|”,而不是PHP的两个”||”!意思就是可以是某个字符或者另一个字符串,比如”/abcd|dcba/”可能匹配”abcd”或者”dcba”。

5贪婪模式:

前面在元字符中提到过”?”还有一个重要的作用,即”贪婪模式”,什么是

求用php正则表达式来替换字符的写法。

字符匹配示例

^输入或行的起始部分。 ^T匹配“This good earth”中的“T”,但不匹配“Uncle Tom’s Cabin”中的“T”。

$输入或行的结尾部分。 h$匹配“teach”中的“h”,但是不匹配“teacher”中的“h”

* 0个或多个前置字符。 um*匹配“rum”中的“um”、“yummy”中的“umm”以及“huge”中的“u”

+ 1个或多个前置字符。 um+匹配“rum”中的“um”和“yummy”中的“umm”,但在“huge”中没有任何匹配项

?前置字符最多出现一次(即,指示前置字符是可选的)。 st?on匹配“Johnson”中的“son”和“Johnston”中的“ston”,但在“Appleton”和“tension”中没有任何匹配项

.除换行符外的任何单字符。.an匹配短语“bran muffins can be tasty”中的“ran”和“can”

x|y x或 y。 FF0000|0000FF匹配 bgcolor=”#FF0000”中的“FF0000”和 font color=”#0000FF”中的“0000FF”

{n}恰好 n个前置字符。 o{2}匹配“loom”中的“oo”和“mooooo”中的前两个“o”,但在“money”中没有任何匹配项

{n,m}至少 n个、至多 m个前置字符。 F{2,4}匹配“#FF0000”中的“FF”和“#FFFFFF”中的前四个“F”

[abc]用括号括起来的字符中的任何一个字符。用连字符指定某一范围的字符(例如, [a-f]等效于 [abcdef])。 [e-g]匹配“bed”中的“e”、“folly”中的“f”和“guard”中的“g”

[^abc]未在括号中括起来的任何字符。用连字符指定某一范围的字符(例如,[^a-f]等效于[^abcdef])。 [^aeiou]最初匹配“orange”中“r”、“book”中的“b”和“eek!”中的“k”

\b词边界(例如空格或回车符)。\bb匹配“book”中的“b”,但在“goober”和“snob”中没有任何匹配项

\B词边界之外的任何内容。\Bb匹配“goober”中的“b”,但在“book”中没有任何匹配项

\d任何数字字符。等效于 [0-9]。\d匹配“C3PO”中的“3”和“apartment 2G”中的“2”

\D任何非数字字符。等效于 [^0-9]。\D匹配“900S”中的“S”和“Q45”中的“Q”

\f换页符。

\n换行符。

\r回车符。

\s任何单个空白字符,包括空格、制表符、换页符或换行符。\sbook匹配“blue book”中的“book”,但在“notebook”中没有任何匹配项

\S任何单个非空白字符。\Sbook匹配“notebook”中的“book”,但在“blue book”中没有任何匹配项

\t制表符。

\w任何字母数字字符,包括下划线。等效于 [A-Za-z0-9_]。 b\w*匹配“the barking dog”中的“barking”以及“the big black dog”中的“big”和“black”

\W任何非字母数字字符。等效于 [^A-Za-z0-9_]。\W匹配“Jake&Mattie”中的“&”和“100%”中的“%”

Control+Enter或 Shift+Enter(Windows)、或者 Control+Return或 Shift+Return或 Command+ Return(Macintosh)回车符。确保如果没有使用正则表达式,则在搜索时取消对“忽略空白差别”的选择。请注意,这匹配特定字符,而不是一般意义上的换行符;例如,它不匹配<br>标签或<p>标签。回车符在“设计”视图中显示为空格而不是换行符。

php正则表达式

优先匹配哪个?

通常是优先匹配左边的(从左往右执行嘛,然后又因为有贪婪性,比如[0-9]*[0-9]*去匹配123,左边的[0-9]*会匹配到12,右边的[0-9]*会匹配到3),正则表达式左边的部分会匹配到能是能使匹配成功的最长的匹配,具体原因如下:

贪婪、回溯和正则导向引正则擎的急切性:正则的{}和*合+有具贪婪性会向后匹配到他们可以匹配的尽可能多的字符串。但是如果重复性的匹配会引起整个(后面的)正则表达式匹配失败时,会引起回溯,放弃最后一次重复匹配(相当于剩余的字符串从左边增加了一位),用表达式后面的部分匹配剩余的字符串。在前面的正则匹配成功后立即用剩余的表达式部分继续匹配后面的内容,如果匹配成功会立刻返回匹配成功,不会继续回溯(php的正则表达式引擎室正则导向的)

里面的(.*)是怎么找得?

*有具贪婪性会向后匹配到.可以匹配的最大长度的字符串,最初匹配到-2011-2012,然后因为回溯不断减少匹配的值,直到匹配-201。

过程是怎样的,

执行顺序:

1.[0-9]{2,4}会先匹配到2010,

2.然后(.*),因为*得贪婪性会匹配到后面所有.能匹配的字符-2011-2012。

3.此时表达式执行到[0-9]{1,2},因为[0-9]{1,2}此时没有任何可以匹配的内容,所以引起回溯(.*)匹配到前一次匹配结果的倒数第2位重新匹配到-2011-201,[0-9]{1,2}与最后一位匹配成功得到字符串最后面的2,因为正则引擎的急切性,匹配成功后会立即用正则表达式剩余的部分继续向后匹配。

4.此时表达式执行到\1,字符串后面没有剩下任何东西所以\1(\1指(.*)匹配的结果-2011-201)匹配失败,然后引起回溯。[0-9]{1,2}向前移一位,结果[0-9]{1,2}没有字符可以进行匹配操作,匹配失败。引起回溯,(.*)匹配到前一次匹配结果的倒数第2位重新匹配到-2011-20,再用[0-9]{1,2}匹配得到12,后面依然没有字符与\1匹配,引起回溯,此次[0-9]{1,2}匹配到1,\1(此时值为-2011-20)与2匹配再次失败。于是重复上面的回溯【此处省去n百字,总之是重复上面的回溯】,直到(.*)匹配到-201,\1匹配到了-2012中的-201,因为正则导向的正则引擎是急切的,不再进行回溯,继续后面的匹配。

5.最后,[0-9]{1,2}与字串剩余部(最后一个字符)2匹配成功返回,因为正则导向的正则引擎是急切的,所以立刻返回匹配结果,不再进行回溯。

睡觉前看到的没想到写出来这么难,不过也没白写,就当总结了。

好了,文章到此结束,希望可以帮助到大家。

深入理解java核心技术pdf?深入理解java虚拟机 pdfopenai和pytorch,如何评价PyTorch