이전 글에서는 "PHP의 리스트, 각 함수와 그 조화 사용법 배우기"를 가져왔는데, 주로 리스트 함수와 각 함수의 사용법, 그리고 이들을 서로 연동하여 사용하는 방법을 설명한 것 같아요. 이제 거의 마스터했으므로 이 기사에서 PHP의 정규식을 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다!
정규 표현식은 처음에 선언된 일부 문자와 이러한 문자의 조합으로 구성된 "규정된 문자열"입니다. 이 규정된 문자열은 실제로 문자열을 필터링하는 데 사용됩니다. 사용자로 로그인할 때 가끔 인증코드나 전화번호 등 특정 데이터를 입력해야 하는 경우가 있는데, 이때 정규식을 사용해야 합니다.
정규식은 복잡해 보이지만 실제로는 어렵지 않습니다.
정규식의 구분자
가장 먼저 배워야 할 것은 정규식의 구분자입니다. 이름에서 알 수 있듯이 구분자는 정규식의 경계를 결정하는 기호입니다. 그리고 경계 내에서는 정규식입니다. 동시에 정규 표현식의 구분 기호는 다음과 같이 규정됩니다.
구분 기호, a-zA-Z0-9는 사용할 수 없지만 다른 모든 문자는 사용할 수 있습니다. 그리고 시작과 끝이 있는 쌍으로 나타나야 합니다.
예제는 다음과 같습니다.
$正则表达式$ %正则表达式% /正则表达式/
주의해야 할 점은 /
가 정규식에서 /를 일치시켜야 하는 경우 Escape 문자를 사용할 수 있다는 것입니다. . 번거롭다면 다음과 같은 다른 구분 기호를 직접 사용할 수 있습니다. /
是转义字符,当我们正则中需要匹配/的时候,可以使用转义一下。如果觉得麻烦的话,可以直接使用其他的定界符比如:
$/$
正则表达式的原子
正则表达式的原子是正则表达式里的最小单位,也就是我们需要匹配的内容,在我们成立的整形额表达式中,最少也要有一个原子。
其实可以理解为,所有可见的不可见的字符都是原子,比如空格、回车、换行、0-9、标点符号、A-Za-z、中文这些都是原子。
preg_match() 函数
在详细的讲原子之前,我们要先了解一下一个函数,那就是preg_match
PHP 中的 preg_match() 函数可以根据定义的正则表达式对字符串进行搜索以及匹配。
语法格式如下:
preg_match ( string $正则 , string $字符串 [, array &$结果] )
根据$正则也就是我们定义的正则表达式,在匹配$字符串,如果存在则返回匹配个数,然后把匹配的结果放在$结果里。如果没有匹配到结果那就返回0。
我们通过示例来看一下:
<?php //定义一个变量叫a,作为我们定义的正则表达式。 $a = '/a/'; $b = 'abbcccddddeeeee'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
输出结果:
由上述示例可以看出,我们定义了变量a,希望能够匹配的是a,正好在$b中存在a,通过if else语句输出成功了。
再来一个示例:
<?php //定义一个变量叫a,作为我们定义的正则表达式。 $a = '/fff/'; $b = 'abbcccddddeeeee'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
输出结果:
上述示例中,希望匹配到字符串,但是$b中不存在,所以没有匹配成功,通过if else语句输出为匹配成功。
知道了preg_match() 函数的基本用法之后我们可以和特殊标识的原子结合起来使用。
特殊标识的原子
d
---匹配一个0-9
D
---除了0-9以外的所有字符
w
---a-zA-Z0-9_
W-
--除了0-9A-Za-z_以外的所有字符
s
---匹配所有空白字符n t r 空格
S
---匹配所有非空白字符
[ ]
---指定范围的原子
它们的具体用法给大家举个例子就明白了:
<?php $a = '/\d/'; $b = '人生自古谁无4'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
输出结果:
在上述示例中,特殊标识的原子d表示的就是0-9的数字,那么在需要匹配的$b中存在一个4,所以匹配成功。
<?php $a = '/\w/'; $b = '人生自古谁无死'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
输出结果:
在上述实例中,特殊标识的原子w表示的是a-zA-Z0-9_ ,在变量b中没有相应的元素,所以输出结果为未匹配到。
其中还有一个[^]
<?php $a = '/[^0-9A-Za-z_]/'; $b = 'abbccc122333'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>정규 표현식의 원자
preg_match
를 이해해야 합니다.🎜🎜PHP에서 preg_match() 함수는 다음과 같이 표현할 수 있습니다. 정의된 정규 표현식 문자열을 검색하고 일치시킵니다. 🎜🎜구문 형식은 다음과 같습니다. 🎜<?php $a = '/\d+/'; $b = "爱你10000年"; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>🎜우리가 정의한 정규식인 $regex에 따라 $string을 일치시킬 때 $string이 있으면 일치하는 개수를 반환한 다음 일치하는 결과를 반환합니다. $result에 배치됩니다. 결과가 없으면 0이 반환됩니다. 🎜🎜🎜예제를 살펴보겠습니다. 🎜
<?php $a = '/ABC/i'; $b = '8988abc12313'; $c = '11111ABC2222'; if(preg_match($a, $b, $d)){ echo '匹配到了,结果为:'; var_dump($d); }else{ echo '没有匹配到'; } ?>🎜출력 결과: 🎜🎜🎜🎜🎜위의 예에서 볼 수 있듯이 a와 일치하기를 바라며 변수 a를 정의했고 a는 $b에 존재하며 if를 통해 출력됩니다. else 문이 성공했습니다. 🎜🎜또 다른 예: 🎜
<?php $a = '/ABC/i'; $b = '8988abc12313'; $c = '11111ABC2222'; if(preg_match($a, $c, $d)){ echo '匹配到了,结果为:'; var_dump($d); }else{ echo '没有匹配到'; } ?>🎜출력 결과: 🎜🎜🎜🎜🎜위의 예에서는 문자열이 일치하기를 원하지만 $b가 존재하지 않으므로 성공적인 일치가 없습니다. if else 문은 일치가 성공했음을 출력합니다. 🎜🎜preg_match() 함수의 기본 사용법을 알고 나면 특별히 식별된 Atom과 조합하여 사용할 수 있습니다. 🎜🎜🎜특별히 식별된 원자🎜🎜🎜🎜🎜
d
---0-9와 일치 🎜🎜🎜🎜D
---0-9자를 제외한 모두 🎜🎜 🎜🎜w
---a-zA-Z0-9_ 🎜🎜🎜🎜W-
--0-9A-Za-z_ 문자를 제외한 모두 🎜🎜🎜🎜s---모든 공백 문자 n t r 공백 일치 🎜🎜🎜🎜S
---공백이 아닌 모든 문자 일치 🎜🎜🎜🎜[ ]
---지정된 원자 범위 🎜🎜🎜🎜예를 들어 구체적인 사용법을 설명합니다: 🎜🎜rrreee🎜출력 결과: 🎜🎜🎜🎜🎜위의 예에서 특별히 식별된 원자 d는 0 -9 숫자를 나타내고 그 안에 4가 있습니다. $b가 일치해야 하므로 일치가 성공합니다. 🎜rrreee🎜출력 결과: 🎜🎜🎜🎜🎜위의 예에서 특별히 식별된 원자 w는 a-zA-Z0-9_를 나타내며, 변수 b에 해당 요소가 없으므로 출력 결과가 일치하지 않습니다. 🎜🎜지정된 간격에 맞지 않는 문자를 나타내는 [^]
문자도 있습니다. 🎜🎜예제는 다음과 같습니다. 🎜rrreee🎜출력 결과: 🎜🎜
通过[^]字符匹配除0-9A-Za-z_以外的字符,未匹配到。
总结一下:
\w
---[a-zA-Z0-9_]
\W
---[^a-zA-Z0-9_]
\d
---[0-9]
\D
---[^0-9]
\s
---[ \t\n\f\r]
\S
---[^ \t\n\f\r]
正则表达式的元字符
在上面的示例中,我们能够看出通过匹配的话,只能匹配一个字符,但是在我们的日常使用中,通常会匹配多个字符,那这时候只通过我们的原子就不能达到我们的目的。就需要通过元字符来帮我们修饰原子,实现更多的功能。
*
---代表匹配前面的一个原子,匹配0次或者任意多次前面的字符。
+
---匹配一次或多次前面的一个字符
?
---前面的字符可有可无【可选】 有或没有
.
---更标准一些应该把点算作原子。匹配除了\n以外的所有字符 或者。注:它的优先级最低了。
^
---必须要以抑扬符之后的字符串开始
$
--- 必须要以$之前的字符结尾
\b
---词边界
\B
---非边界
{m}
---有且只能出现m次
{n,m}
---可以出现n到m次
{m,}
---至少m次,最大次数不限制
()
---改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它
接下来我们通过一些例子来实例看一下这些元字符的使用:
<?php $a = '/\d+/'; $b = "爱你10000年"; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
输出结果:
通过元字符+的添加,匹配到了多次字符,\d+中d是匹配数字,+则表示最少匹配一次前面的字符。
正则表达式的模式修正符
通过原子和元字符的了解,我们已经完成了正则表达式的入门,但是这仍然不能代表正则表达式的真正实力,如果我们只希望正则表达式匹配一部分应该怎么办?有些特殊情况依然需要处理,这时候我们就要用到正则表达式的模式修正符。
下面列举一些常用的模式修正符:
i 模式中的字符将同时匹配大小写字母.
m 字符串视为多行
s 将字符串视为单行,换行符作为普通字符.
x 将模式中的空白忽略.
A 强制仅从目标字符串的开头开始匹配.
D 模式中的美元元字符仅匹配目标字符串的结尾.
U 匹配最近的字符串.
它的用法如下:
/正则表达式/模式修正符
接下来我们通过一些实例来看一下它的使用:
<?php $a = '/ABC/i'; $b = '8988abc12313'; $c = '11111ABC2222'; if(preg_match($a, $b, $d)){ echo '匹配到了,结果为:'; var_dump($d); }else{ echo '没有匹配到'; } ?>
输出结果:
i可以让匹配的时候同时匹配大小写,那么接下来把匹配的$b换成$c试一下,我们看一下输出结果:
<?php $a = '/ABC/i'; $b = '8988abc12313'; $c = '11111ABC2222'; if(preg_match($a, $c, $d)){ echo '匹配到了,结果为:'; var_dump($d); }else{ echo '没有匹配到'; } ?>
输出结果:
推荐学习:《PHP视频教程》
위 내용은 PHP 정규식의 흥미로운 기본(그림과 함께 자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!