이 글의 내용은 PHP의 정규 관계에 관한 것으로, 이는 특정 참고 가치가 있습니다. 이제 여러분과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다
정규 표현식은 설명 문자입니다. 문자열 결과의 규칙은 일치하는 문자열을 일치시키고, 바꾸고, 가로챌 수 있는 특정 형식 지정 패턴입니다. 일반적으로 사용되는 언어에는 기본적으로 JavaScript, Java 등 정규 표현식이 있습니다. 사실, 한 언어의 일반적인 사용법을 이해하는 한, 다른 언어의 일반적인 규칙을 사용하는 것은 비교적 간단합니다. 본문은 주로 다음 문제를 해결하는 데 중점을 둡니다. 일반적으로 사용되는 이스케이프 문자는 무엇입니까?
일치 패턴
PHP에서 정규식을 사용하는 방법
PHP의 어떤 측면에서 정규식을 사용해야 합니까?
이메일 일치를 수행하는 방법, URL 일치, 휴대폰 일치
정규식을 사용하여 문자열의 특정 문자를 바꾸는 방법
탐욕적 일치와 지연 일치의 차이점
정규식의 역추적 및 솔리드 그룹화
무엇입니까? 정규식의 장점과 단점
정규식의 기본 지식 요약
행 위치 지정자는 문자열의 경계를 설명하는 데 사용됩니다. "$"
는 줄의 끝을 나타냅니다. "^"
는 줄의 시작을 나타냅니다(예: "^de"
). de " de$"
로 시작하는 문자열은 de로 끝나는 문자열을 나타냅니다.
한정자는 주로 각 문자열의 발생 횟수를 제한하는 데 사용됩니다.
“$”
表示行结尾“^”
表示行开始如"^de"
,表示以de开头的字符串 "de$"
,表示以de结尾的字符串。
我们在查找的一个单词的时候,如an是否在一个字符串”gril and body”中存在,很明显如果匹配的话,an肯定是可以匹配字符串“gril and body”匹配到,怎样才能让其匹配单词,而不是单词的一部分呢?这时候,我们可以是哟个单词定界符b。
banb 去匹配”gril and body”的话,就会提示匹配不到。
当然还有一个大写的B,它的意思,和b正好相反,它匹配的字符串不能使一个完整的单词,而是其他单词或字符串中的一部分。如BanB。
选择字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用”[]”与”|”的区别,在于”[]”只能匹配单个字符,而”|”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。
正则表达式提供了”^”来表示排除不符合的字符,^一般放在[]中。如[^1-5],该字符不是1~5之间的数字。
限定符主要是用来限定每个字符串出现的次数。
限定字符 | 含义 |
---|---|
? | 零次或一次 |
* | 零次或多次 |
+ | 一次或多次 |
{n} | n次 |
{n,} | 至少n次 |
{n,m} | n到m次 |
如(D+)表示一个或多个D
匹配任意一个字符(不包含换行符)
0회 또는 1회
+ | |
---|---|
{n} | n회 |
{n,} | 에서 최소 n회 |
{n,m} | n ~ m회 |
예를 들어 (D+)는 하나 이상의 D를 나타냅니다. | |
식의 백슬래시( |
식의 백슬래시는 이스케이프, 사전 정의된 문자 집합 지정, 어설션 정의, 인쇄할 수 없는 문자 표시 등 여러 가지 의미를 갖습니다. |
이스케이프 문자는 주로 일부 특수 문자를 일반 문자로 변환합니다. 일반적으로 사용되는 특수 문자로는 ".", "?", "" 등이 있습니다. | 사전 정의된 문자 집합 지정 |
문자
d | |
---|---|
D | 모든 10진수 번호 |
s | 모든 공백 문자(공백, 줄 바꿈, 폼 피드, 캐리지 리턴, 탭 문자) |
S | 공백이 아닌 모든 문자 |
w | 모든 단어 문자 |
W | 모든 단어가 아닌 문자 |
###인쇄할 수 없는 문자 표시 |
정규 표현식에서 괄호의 주요 기능은 다음과 같습니다.
(|, *, ^)와 같은 한정자의 범위를 변경합니다.
(my|your)baby와 같이 "가 없는 경우 () ", |는 my 또는 yourbaby와 일치합니다. 괄호를 사용하면 mybaby 또는 yourbaby와 일치합니다.
쉬운 역참조를 위한 그룹
역참조는 하위 표현식의 "메모리" 기능을 사용하여 연속된 문자열이나 문자를 일치시킵니다. 예를 들어, (dqs)(pps)12는 문자열 dqsppsdqspps와 일치함을 의미합니다. 다음 PHP 애플리케이션에서는 역참조에 대해 자세히 알아보겠습니다.
패턴 수정자의 역할은 패턴, 즉 정규식이 해석되는 방식을 설정하는 것입니다. PHP의 주요 모드는 다음과 같습니다:
Modifier | Description |
---|---|
i | 대소문자 무시 |
m | 다중 텍스트 모드 |
s | 한 줄 텍스트 모드 |
x | 공백 문자 무시 |
소위 문자열 일치는 암시적으로 문자열이 다른 문자열을 포함하거나 같은지 여부를 결정하는 것입니다. 정규식을 사용하지 않으면 PHP에서 제공되는 많은 방법을 사용하여 그러한 판단을 내릴 수 있습니다.
strstr 함수
string strstr (string haystack,mix e바늘 [ , bool $before_needle = false ])
참고 1: hayst a ck은 thingscharacterssymbolstring일 때 needle이 검색되는 문자열일 때 입니다. 이 함수는 대소문자를 구분합니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 참고 2: 반환 값은 시작부터 끝까지입니다. 바늘. 참고 3: $needle의 경우 문자열이 아닌 경우 정수로 처리되어 해당 문자의 일련번호로 사용됩니다. 참고 4: before_needle이 true인 경우 이전 항목을 반환합니다. strstr 함수는 대소문자를 구분하지 않는다는 점을 제외하면 strstr 함수와 동일합니다. strpo 함수 int strpos ( string hayst
a,
me
dneedle [, int $offset = 0 ] ) 발생 위치 주제와 패턴으로 제공된 정규식 사이의 일치를 검색합니다. 정규식 대체를 사용하는 경우 PHP는 preg_replace _callback 및 preg_replace 함수를 제공합니다. preg_replace의 프로토타입은 다음과 같습니다. 解析:当然这样可能会遇到,当第一次去除了重复了字符串后,又出来重复的字符串。如字符串味’gewwenngeeojjgegop’,针对这中问题,当然,这样的话,通过判断,继续替换下去。 例3 解析:$n在正则表达式外使用反向引用。n代表第几次匹配到的结果。 php提供了explode函数去分割字符串,与其对应的是implode。关于explode原型如下: 关于通过正则表达式进行字符串分割,php提供了split、preg_split 函数。preg_split() 函数,通常是比 split() 更快的替代方案。 例题 解法二: 贪婪匹配:就是匹配尽可能多的字符。 懒惰匹配:就是匹配尽可能少的字符。 首先我们需要清楚什么是回溯,回溯就像是在走岔路口,当遇到岔路的时候就先在每个路口做一个标记。如果走了死路,就可以照原路返回,直到遇见之前所做过的标记,标记着还未尝试过的道路。如果那条路也走不能,可以继续返回,找到下一个标记,如此重复,直到找到出路,或者直到完成所有没有尝试过的路。首先我们看例题 看到上面的程序,可能都清楚是什么意思,就是匹配$str是否包含这样一个由”a+0个或多个字母+c”不区分大小写的字符串。但是至于程序怎样去匹配的呢?匹配的过程中,回溯了多少次呢? 现在,如果我们将pattern改为pattern=’/a\w*?c/i’;又会回溯多少次呢?正确答案是回溯四次。 固态分组,目的就是减少回溯次数, 使用(?>…)括号中的匹配时如果产生了备选状态,那么一旦离开括号便会被立即 引擎抛弃掉。举个典型的例子如: ‘\w+:’这个表达式在进行匹配时的流程是这样的,会优先去匹配所有的符合\w的字符,假如字符串的末尾没有’:’,即匹配没有找到冒号,此时触发回溯机制,他会迫使前面的\w+释放字符,并且在交还的字符中重新尝试与’:’作比对。但是问题出现在这里: \w是不包含冒号的,显然无论如何都不会匹配成功,可是依照回溯机制,引擎还是得硬着头皮往前找,这就是对资源的浪费。所以我们就需要避免这种回溯,对此的方法就是将前面匹配到的内容固化,不令其存储备用状态!,那么引擎就会因为没有备用状态可用而只得结束匹配过程。大大减少回溯的次数。 当然有的时候,又需慎用固态分组,如下,我要检查$str中是否包含以a结尾的字符串,很明显是包含的,但是因为使用了固态分组,反而达不到我们想要的效果 php中其他常用字符串操作函数 字符串截取截取 字符串中大小写转换 字符串比较 字符串过滤 字符串翻转 字符串随机排序 매칭을 위해 preg_match 함수를 사용하세요. 다음 내용은 TP에서 복사됩니다.
계산(대소문자 구분 안함) 정규식 사용 일치를 위해 PHP에서는 일반 일치를 위해 preg_math() 및 preg_match_all 함수가 제공됩니다. 이 두 함수의 프로토타입은 다음과 같습니다. int preg_match|preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
pattern: 검색할 패턴, 문자열 유형입니다.
제목: 문자열을 입력하세요.
matches: 매개변수 일치가 제공되면 검색 결과로 채워집니다. ㅋㅋㅋ 전체모델 공식 matchmatch 에서 의 textthis에 match[1]에는 첫 번째 캡처 하위 그룹과 일치하는 텍스트가 포함됩니다. 플래그: 플래그는 다음 플래그 값으로 설정할 수 있습니다: PREG_OFFSET_CAPTURE 이 플래그가 전달되면 일치 항목이 발생할 때마다 문자열 오프셋(대상 문자열에 상대적)이 반환됩니다. 참고: 이는 match 매개변수에 채워진 배열을 변경하여 각 요소가 0번째 요소가 일치하는 문자열이고 첫 번째 요소가 대상 문자열 subject에서 일치하는 문자열의 오프셋이 되는 문자열이 됩니다. offset: 일반적으로 대상 문자열의 시작 부분부터 검색을 시작합니다. 선택적 매개변수인 offset은 대상 문자열의 알 수 없는 지점부터 검색을 시작하도록 지정하는 데 사용됩니다(단위는 바이트). 반환 값: preg_match()는 패턴과 일치하는 수를 반환합니다. preg_match()가 첫 번째 일치 후 검색을 중지하므로 해당 값은 0(일치 없음) 또는 1이 됩니다. preg_match_all()은 이것과 다르며, 끝에 도달할 때까지 주제를 검색합니다. 오류가 발생하면 preg_match()는 FALSE를 반환합니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
예 예 1 문자열 "http://blog.csdn.net/hsd2012"에 csdn이 포함되어 있는지 확인 해결책 1(일반 규칙은 적용되지 않음): 일반 규칙인 경우 해당되지 않는 경우 strstr 또는 strpos를 사용할 수 있습니다. 여기서는 strstr 함수를 사용하겠습니다. 코드는 다음과 같습니다. $str='http://blog.csdn.net/hsd2012';function checkStr1($str,$str2)
{ return strstr1($str,$str2)?true:false;
}echo checkStr($str,'csdn');
해결책 2: 일반 규칙을 사용하세요. 존재 여부만 확인하면 되므로 preg_match를 선택하세요. $str='http://blog.csdn.net/hsd2012';$pattern='/csdn/';function checkStr2($str,$str2)
{ return preg_match($str2,$str)?true:false;
}echo checkStr2($str,$pattern);
예제 2 (단어 구분 기호 검토 검토) "I am a good boy"라는 문자열에 go라는 단어가 포함되어 있는지 확인 먼저 문자열이 아닌 단어인지 확인하므로 비교할 때 다음이 필요합니다. 비교하려면 'go'가 포함되어 있는지, 즉 문자열 go 앞뒤에 공백이 있는지 여부입니다. 분석: 비정규 비교를 사용하는 경우 위의 checkStr1() 함수만 호출하면 됩니다. 참고로 두 번째 매개변수인 'go' 앞뒤에 공백을 추가해야 합니다. 정규식을 사용하는 경우 단어 구분 기호 b를 사용하고 $pattern='/bgob/'; 그런 다음 checkStr2 함수를 호출하는 것을 고려할 수 있습니다. 예 3(역 참조 검사) 문자열을 판단합니다. "I am a good boy"에는 동일한 문자 3개가 포함되어 있습니다. 분석: 이때 정규식을 사용하지 않으면 문자가 너무 많아 모든 문자를 구별할 수 없기 때문에 판단하기 어려울 것입니다. 문자 문자열을 비교하면 작업 부하가 상대적으로 큽니다. 이번에는 현재 역참조가 포함됩니다. PHP 정규식에서 n은 n번째 일치 결과를 나타내는 데 사용됩니다. 예를 들어 5는 다섯 번째 일치 결과를 나타냅니다. 그래서 이 질문에 대해 가장 주의해야 할 점은 역방향 매칭을 사용할 때 ()를 사용해야 한다는 것입니다. php에서 문자열 대체정규식을 사용하지 않습니다php에서 문자열을 대체할 때 정규식이 적용되지 않으면 보통 substr, mb_substr, str_replace, substr_replace를 사용합니다.
함수 기호
Function
Description
str_replace(find,replace,string,count)
문자열을 사용하여 문자열의 다른 문자를 바꿉니다.
필수를 찾아보세요. 찾을 값을 지정합니다. 교체가 필요합니다. find의 값을 대체할 값을 지정합니다. 문자열이 필요합니다. 검색할 문자열을 지정합니다. 선택적으로 계산합니다. 대체 횟수를 계산하는 변수입니다.
substr_replace(string,replacement,start,length)
문자열의 일부를 다른 문자열로 바꿉니다. 사용자 정의 위치에서 문자열을 교체하는 데 적합합니다.
문자열이 필요합니다. 확인할 문자열을 지정합니다. 교체가 필요합니다. 삽입할 문자열을 지정합니다. 시작이 필요합니다. 문자열에서 대체를 시작할 위치를 지정합니다.
정규식 사용
혼합 preg_replace ( 혼합 pattern,mixedreplacement , 혼합 su bje ct[,intlimit = -1 [, int &count]])Letter 카운트 functioncandescribedescription: 은 charactersymbol에서 찾을 수 있습니다. 제목 pat tern,ranafteruselimi t 그럼 대체 가능한 limitedmadeSubstitute -pressionsportements .pregreplacecallback与pregreplace功能相识,不同的是pregreplaceback使用一个回调函数callback来代替replacement.−例1将字符串”hello,中国”中的hello替换为′你好′;如果不是用正则:str=’hello,中国’; str=strreplace(′hello′,′你好′,str) 或是使用str=substrreplace(str,’你好’,0,5) 使用正则 pattern=′/hello/′;str=preg_replace (pattern,′你好′,str); - 例2 去除字符串”gawwenngeeojjgegop”中连续相同的字母$str='gawwenngeeojjgegop';$pattern='/(.)\1/';$str=preg_replace($pattern,'',$str);
将字符串中”age13gegep3iorji65k65k”;中出现的连续两个数字改为第二个数字,如字符串中13被改为3$str='age13gegep3iorji65k65k';$pattern='/(\d)(\d)/';$str=preg_replace($pattern,'$2', $str);
php中字符串分割
不适用正则
array explode ( string delimiter,stringstring [, int $limit ] )
delimiter:边界上的分隔字符。
string:输入的字符串。
limit:如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。如果 limit 是 0,则会被当做 1。使用正则
array preg_split ( string pattern,stringsubject [, int limit=−1[,intflags = 0 ]] )
将字符串 ‘http://blog.csdn.net/hsd2012/article/details/51152810‘按照’/’进行分割
解法一:$str='http://blog.csdn.net/hsd2012/article/details/51152810';$str=explode('/', $str);
$str='http://blog.csdn.net/hsd2012/article/details/51152810';$pattern='/\//'; /*因为/为特殊字符,需要转移*/$str=preg_split ($pattern, $str);
php中贪婪匹配与惰性匹配
比如,正则表达式中m.*n,它将匹配最长以m开始,n结尾的字符串。如果用它来搜索manmpndegenc的话,它将匹配到的字符串是manmpndegen而非man。可以这样想,当匹配到m的时候,它将从后面往前匹配字符n。
有的时候,我们需要并不是去贪婪匹配,而是尽可能少的去匹配。这时候,就需要将其转为惰性匹配。怎样将一个贪婪匹配转为惰性匹配呢?只需要在其后面添加一个”?”即可。如m.*?n将匹配manmpndegenc,匹配到的字符串是man。
函数符
描述
*?
零次或多次,但尽可能少的匹配
+?
一次或多次,但尽可能少的匹配
??
0次或1次,但尽可能少的匹配
{n,}?
至少n次,但尽可能少的匹配
{n,m}?
n到m次 ,但尽可能少的匹配
php正则表达式之回溯与固态分组
回溯
$str='aageacwgewcaw';$pattern='/a\w*c/i';$str=preg_match($pattern, $str);
匹配过程
接下来操作描述
‘a\w*c’中a匹配到’aageacwgewcaw’中第一个字符a
\w进行下一个字符匹配
因为\w是贪婪匹配,会一直匹配到’aageacwgewcaw’中最后一个字符w
c进行下一个字符匹配时
‘a\w*c’中c发现没有可以匹配的
于是\w匹配进行第一次回溯,匹配到倒数第二个字符a
‘a\w*c’中c发现还是没有可以匹配的
于是\w匹配进行第二次回溯,匹配到倒数第三个字符c
‘a\w*c’中c匹配成功
匹配结束返回结果
固态分组
如下代码,就不会进行回溯:$str='nihaoaheloo';$pattern='/(?>\w+):/';$rs=preg_match($pattern, $str);
$str='nihaoahelaa';$pattern1='/(?>\w+)a/';$pattern2='/\w+a/';$rs=preg_match($pattern1, $str);//0$rs=preg_match($pattern2, $str);//1
string substr ( string string,intstart [, int length])stringmbsubstr(stringstr , int start[,intlength = NULL [, string $encoding = mb_internal_encoding() ]] )
strtoupper
strtolower
ucfirst
ucwords
-strcmp、strcasecmp、strnatcmp
strrev($str);
string str_shuffle ( string $str )보충
이메일 매칭, URL 매칭, 휴대폰 매칭을 수행하는 방법
이메일 인증
pattern=′/w+([−+ .]w +)✽@w+([−.]w+)auto.w+([−.] 우 +)*/';
URL 일치
pattern='/^http(s?)://(?:[A-za-z0-9-]+.)+[A-za -z]{2,4}(:d+)?(?:[/?#][/=?%-&~`@[]':+!.#w]*)?/'; 확인
pattern=′/1[3458]d 10/'; ㅋㅋㅋ ㅋㅋㅋ PHP 정규식의 장점과 단점PHP 정규식은 다음과 같습니다. 때로는 PHP 함수의 많은 어려운 일치 또는 교체 문제를 해결하는 데 도움을 주세요. 그런 다음 우리는 종종 PHP에서 정규식의 효율성을 고려해야 합니다. 따라서 특정 상황에서 정규식을 사용해야 하는 경우가 아니면 정규식 사용을 피할 수 있다면 정규식을 사용하지 않도록 노력해야 합니다. 그렇지 않으면 정규식을 효과적으로 줄일 수 있습니다. 역추적 횟수. 관련 추천: PHP 정규식 (휴대폰번호 177개 추가)PHP 정규식 공유
위 내용은 PHP의 정규 관계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!