>  기사  >  백엔드 개발  >  PHP의 정규 관계

PHP의 정규 관계

不言
不言원래의
2018-04-23 13:55:081528검색

이 글의 내용은 PHP의 정규 관계에 관한 것으로, 이는 특정 참고 가치가 있습니다. 이제 여러분과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다

Overview

정규 표현식은 설명 문자입니다. 문자열 결과의 규칙은 일치하는 문자열을 일치시키고, 바꾸고, 가로챌 수 있는 특정 형식 지정 패턴입니다. 일반적으로 사용되는 언어에는 기본적으로 JavaScript, Java 등 정규 표현식이 있습니다. 사실, 한 언어의 일반적인 사용법을 이해하는 한, 다른 언어의 일반적인 규칙을 사용하는 것은 비교적 간단합니다. 본문은 주로 다음 문제를 해결하는 데 중점을 둡니다. 일반적으로 사용되는 이스케이프 문자는 무엇입니까?

  • 일치 패턴

  • PHP에서 정규식을 사용하는 방법

  • PHP의 어떤 측면에서 정규식을 사용해야 합니까?

  • 이메일 일치를 수행하는 방법, URL 일치, 휴대폰 일치

  • 정규식을 사용하여 문자열의 특정 문자를 바꾸는 방법

  • 탐욕적 일치와 지연 일치의 차이점

  • 정규식의 역추적 및 솔리드 그룹화

  • 무엇입니까? 정규식의 장점과 단점

  • 정규식의 기본 지식 요약

  • 행 위치 지정자(^ 및 $)
  • 행 위치 지정자는 문자열의 경계를 설명하는 데 사용됩니다. "$"는 줄의 끝을 나타냅니다. "^"는 줄의 시작을 나타냅니다(예: "^de"). de " de$"로 시작하는 문자열은 de로 끝나는 문자열을 나타냅니다.

    단어 구분자

  • an이 문자열 "gril and body"에 존재하는지 여부와 같은 단어를 검색할 때, 일치하는 경우 an은 문자열 "gril and body" "body와 확실히 일치할 수 있다는 것이 명백합니다. " 일치하는 경우, 단어의 일부가 아닌 단어와 일치하도록 하려면 어떻게 해야 할까요? 이때 단어 구분 기호 b를 사용할 수 있습니다.
    banb가 "gril and body"와 일치하면 일치할 수 없다는 메시지가 표시됩니다.
    물론 b와 정반대를 의미하는 대문자 B가 있습니다. 이것이 일치하는 문자열은 완전한 단어일 수 없고 다른 단어나 문자열의 일부일 수 있습니다. BanB와 같은.

    또는 표시할 문자(|)를 선택하세요.

  • 또는 표시할 문자를 선택하세요. 예를 들어 Aa|aA는 Aa 또는 aA를 의미합니다. "[]"와 "|" 사용의 차이점은 "[]"는 단일 문자에만 일치할 수 있는 반면 "|"는 모든 길이의 문자열과 일치할 수 있다는 것입니다. "[]"를 사용할 때에는 a, b, c, d를 나타내는 [a-d] 등 연결문자 "-"와 함께 사용되는 경우가 많다.
  • 문자 제외, 연산 제외

    정규식은 일치하지 않는 문자를 제외하기 위해 "^"를 제공하며, ^는 일반적으로 [] 안에 배치됩니다. 예를 들어 [^1-5]는 1에서 5 사이의 숫자가 아닙니다.
  • 한정자 (?*+{n, m})

  • 한정자는 주로 각 문자열의 발생 횟수를 제한하는 데 사용됩니다.

제한된 문자

의미

“$”表示行结尾“^”表示行开始如"^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,m})

限定符主要是用来限定每个字符串出现的次数。

限定字符 含义
零次或一次
* 零次或多次
+ 一次或多次
{n} n次
{n,} 至少n次
{n,m} n到m次

如(D+)表示一个或多个D

点号操作符

匹配任意一个字符(不包含换行符)

表达式中的反斜杠(

?

0회 또는 1회

*0회 이상+1회 이상{n}n회{n,} 에서 최소 n회{n,m}n ~ m회

점 연산자

는 모든 문자와 일치합니다(줄바꿈 문자는 포함되지 않음) )이스케이프 문자
예를 들어 (D+)는 하나 이상의 D를 나타냅니다.

식의 백슬래시()

식의 백슬래시는 이스케이프, 사전 정의된 문자 집합 지정, 어설션 정의, 인쇄할 수 없는 문자 표시 등 여러 가지 의미를 갖습니다.
이스케이프 문자는 주로 일부 특수 문자를 일반 문자로 변환합니다. 일반적으로 사용되는 특수 문자로는 ".", "?", "" 등이 있습니다. 사전 정의된 문자 집합 지정

문자

의미d모든 10진수 [0-9]D모든 10진수 번호 s 모든 공백 문자(공백, 줄 바꿈, 폼 피드, 캐리지 리턴, 탭 문자)S공백이 아닌 모든 문자w모든 단어 문자W모든 단어가 아닌 문자
###인쇄할 수 없는 문자 표시
🎜문자 🎜🎜 의미 🎜🎜🎜🎜🎜🎜a🎜🎜알람 🎜🎜🎜🎜b🎜 🎜 백스페이스🎜🎜🎜🎜f🎜🎜페이지 change🎜🎜🎜🎜n🎜🎜줄 바꿈🎜🎜🎜🎜r🎜🎜Enter🎜🎜🎜🎜t🎜🎜Character🎜🎜 🎜🎜

대괄호 문자()

정규 표현식에서 괄호의 주요 기능은 다음과 같습니다.

  • (|, *, ^)와 같은 한정자의 범위를 변경합니다.
    (my|your)baby와 같이 "가 없는 경우 () ", |는 my 또는 yourbaby와 일치합니다. 괄호를 사용하면 mybaby 또는 yourbaby와 일치합니다.

  • 쉬운 역참조를 위한 그룹

역참조

역참조는 하위 표현식의 "메모리" 기능을 사용하여 연속된 문자열이나 문자를 일치시킵니다. 예를 들어, (dqs)(pps)12는 문자열 dqsppsdqspps와 일치함을 의미합니다. 다음 PHP 애플리케이션에서는 역참조에 대해 자세히 알아보겠습니다.

패턴 수정자

패턴 수정자의 역할은 패턴, 즉 정규식이 해석되는 방식을 설정하는 것입니다. PHP의 주요 모드는 다음과 같습니다:

Modifier Description
i 대소문자 무시
m 다중 텍스트 모드
s 한 줄 텍스트 모드
x 공백 문자 무시

정규 표현식은 php에 적용됩니다

php의 문자열 일치

소위 문자열 일치는 암시적으로 문자열이 다른 문자열을 포함하거나 같은지 여부를 결정하는 것입니다. 정규식을 사용하지 않으면 PHP에서 제공되는 많은 방법을 사용하여 그러한 판단을 내릴 수 있습니다.

정규 매칭을 사용하지 마세요

  • strstr 함수
    string strstr (string haystack,mix e바늘 [ , bool $before_needle = false ])

    • 참고 1: hayst a ckthingscharacterssymbolstring일 때 needle이 검색되는 문자열일 때 입니다. 이 함수는 대소문자를 구분합니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 참고 2: 반환 값은 시작부터 끝까지입니다. 바늘. 참고 3: $needle의 경우 문자열이 아닌 경우 정수로 처리되어 해당 문자의 일련번호로 사용됩니다. 참고 4: before_needle이 true인 경우 이전 항목을 반환합니다. strstr 함수는 대소문자를 구분하지 않는다는 점을 제외하면 strstr 함수와 동일합니다. strpo 함수 int strpos ( string hayst

      a
    • c
    • k

      ,

      m
    • i
    • x

      e

      dneedle [, int $offset = 0 ] )
    • 참고 1: 선택적 오프셋 매개변수를 사용하여 건초 더미에서 검색을 시작할 문자를 지정할 수 있습니다. 반환된 숫자 위치는 건초 더미의 시작 위치를 기준으로 합니다. ㅋㅋㅋ
    • strrpos - 지정된 값을 계산합니다. string 대상 문자열에서 마지막
  • 발생 위치

  • strripos - 대상 문자열에서 지정된 문자열의 마지막

    발생 위치
    계산(대소문자 구분 안함) 정규식 사용 일치를 위해 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) 문자열의 일부를 다른 문자열로 바꿉니다. 사용자 정의 위치에서 문자열을 교체하는 데 적합합니다. 문자열이 필요합니다. 확인할 문자열을 지정합니다. 교체가 필요합니다. 삽입할 문자열을 지정합니다. 시작이 필요합니다. 문자열에서 대체를 시작할 위치를 지정합니다.

    정규식 사용

    정규식 대체를 사용하는 경우 PHP는 preg_replace _callback 및 preg_replace 함수를 제공합니다. preg_replace의 프로토타입은 다음과 같습니다.
    혼합 preg_replace ( 혼합 pattern,mixedreplacement , 혼합 su bje ct[,intlimit = -1 [, int &count]])Letter 카운트 functioncandescribedescription: charactersymbol에서 찾을 수 있습니다. 제목 pat tern,ranafteruselimi t 그럼 대체 가능한 limitedmadeSubstitute -pressionsportements .pregreplacecallbackpregreplace识,不同的是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);

    解析:当然这样可能会遇到,当第一次去除了重复了字符串后,又出来重复的字符串。如字符串味’gewwenngeeojjgegop’,针对这中问题,当然,这样的话,通过判断,继续替换下去。

    • 例3 
      将字符串中”age13gegep3iorji65k65k”;中出现的连续两个数字改为第二个数字,如字符串中13被改为3

    $str='age13gegep3iorji65k65k';$pattern='/(\d)(\d)/';$str=preg_replace($pattern,'$2', $str);

    解析:$n在正则表达式外使用反向引用。n代表第几次匹配到的结果。

    php中字符串分割

    不适用正则

    php提供了explode函数去分割字符串,与其对应的是implode。关于explode原型如下: 
    array explode ( string delimiter,stringstring [, int $limit ] ) 
    delimiter:边界上的分隔字符。 
    string:输入的字符串。 
    limit:如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。如果 limit 是 0,则会被当做 1。

    使用正则

    关于通过正则表达式进行字符串分割,php提供了split、preg_split 函数。preg_split() 函数,通常是比 split() 更快的替代方案。 
    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);

    看到上面的程序,可能都清楚是什么意思,就是匹配$str是否包含这样一个由”a+0个或多个字母+c”不区分大小写的字符串。但是至于程序怎样去匹配的呢?匹配的过程中,回溯了多少次呢?

    匹配过程 接下来操作描述
    ‘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匹配成功 匹配结束返回结果

    现在,如果我们将pattern为pattern=’/a\w*?c/i’;又会回溯多少次呢?正确答案是回溯四次。

    固态分组

    固态分组,目的就是减少回溯次数, 使用(?>…)括号中的匹配时如果产生了备选状态,那么一旦离开括号便会被立即 引擎抛弃掉。举个典型的例子如: ‘\w+:’这个表达式在进行匹配时的流程是这样的,会优先去匹配所有的符合\w的字符,假如字符串的末尾没有’:’,即匹配没有找到冒号,此时触发回溯机制,他会迫使前面的\w+释放字符,并且在交还的字符中重新尝试与’:’作比对。但是问题出现在这里: \w是不包含冒号的,显然无论如何都不会匹配成功,可是依照回溯机制,引擎还是得硬着头皮往前找,这就是对资源的浪费。所以我们就需要避免这种回溯,对此的方法就是将前面匹配到的内容固化,不令其存储备用状态!,那么引擎就会因为没有备用状态可用而只得结束匹配过程。大大减少回溯的次数。 
    如下代码,就不会进行回溯:

    $str='nihaoaheloo';$pattern='/(?>\w+):/';$rs=preg_match($pattern, $str);

    当然有的时候,又需慎用固态分组,如下,我要检查$str中是否包含以a结尾的字符串,很明显是包含的,但是因为使用了固态分组,反而达不到我们想要的效果

    $str='nihaoahelaa';$pattern1='/(?>\w+)a/';$pattern2='/\w+a/';$rs=preg_match($pattern1, $str);//0$rs=preg_match($pattern2, $str);//1

    php中其他常用字符串操作函数

    • 字符串截取截取 
      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 매칭, 휴대폰 매칭을 수행하는 방법

    매칭을 위해 preg_match 함수를 사용하세요. 다음 내용은 TP에서 복사됩니다.
    이메일 인증
    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.