programing

경고: preg_replace(): 알 수 없는 수식자

css3 2023. 3. 31. 22:32

경고: preg_replace(): 알 수 없는 수식자

다음 오류가 발생하였습니다.

경고: 38행의 xxx.php에 preg_replace(): 알 수 없는 수식자 ']가 있습니다.

38행의 코드는 다음과 같습니다.

<?php echo str_replace("</ul></div>", "", preg_replace("<div[^>]*><ul[^>]*>", "", wp_nav_menu(array('theme_location' => 'nav', 'echo' => false)) )); ?>

어떻게 하면 이 문제를 해결할 수 있을까요?

에러가 발생하는 이유

PHP에서는 정규식은 구분자 쌍으로 묶어야 합니다.딜리미터는 영숫자, 백슬래시, 공백이 아닌 임의의 문자를 사용할 수 있습니다./,#,~이치노및 구분자일 . '개폐 구분자'와 '종료 구분자'는 '개폐 구분자'입니다.<pattern_goes_here>,[pattern_goes_here]모두 유효합니다.

"Unknown modifier X" 오류는 보통 다음 두 가지 경우에 발생합니다.

  • 정규식에 딜리미터가 없는 경우.

  • 패턴을 이스케이프하지 않고 패턴 내에서 딜리미터를 사용하는 경우.

은 " " 입니다.<div[^>]*><ul[^>]*>은 regex에서 모든 <로로 합니다.>정규식 패턴으로, 그 이후의 모든 것은 수식자로 표시됩니다.

Regex: <div[^>  ]*><ul[^>]*>
       │     │  │          │
       └──┬──┘  └────┬─────┘
       pattern    modifiers

]서 알 수 없는가 나왔는데, 는 닫힘 입니다.마감 후에 표시되기 때문입니다.>딜리미터를 지정합니다.PHP를 사용하다

알 수 이 '에 관한 일 수 .*,+,p,/ ★★★★★★★★★★★★★★★★★」)또는 다른 편지나 편지나 편지 같은 것도요.만.imsxeADSUXJu는 유효한 PCRE 수식어입니다.

수정 방법

수정은 간단합니다.regex 패턴을 유효한 구분 기호로 감싸기만 하면 됩니다.이 경우 다음 항목을 선택하여 얻을 수 있습니다.

~<div[^>]*><ul[^>]*>~
│                   │
│                   └─ ending delimiter
└───────────────────── starting delimiter

딜리미터를 사용했는데도 이 오류가 발생하는 경우 패턴 자체에 해당 딜리미터의 이스케이프되지 않은 항목이 포함되어 있을 수 있습니다.

또는 이스케이프 구분자

/foo[^/]+bar/i분명 오류를 범할 거야따라서 regex 내에 백슬래시가 있는 경우 백슬래시를 사용하여 이스케이프할 수 있습니다.

/foo[^\/]+bar/i
│      │     │
└──────┼─────┴─ actual delimiters
       └─────── escaped slash(/) character

정규식 패턴에 딜리미터 문자가 너무 많이 포함되어 있는 경우 이 작업은 지루한 작업입니다.

물론 다른 딜리미터를 모두 사용하는 것이 보다 깔끔한 방법입니다.안 입니다. 를 들어, " 패턴 안 어디에도 않는 입니다.#-#foo[^/]+bar#i.

기타 읽기:

기타 예

참조 답변에 "알 수 없는 수정자" 경고의 이유가 이미 설명되어 있습니다.이것은 다른 전형적인 변종들을 비교한 것입니다.

  • regex 를 /(delimer)/첫 번째 문자가 아닌 기호는 1로 간주됩니다. 경고는 뒤에 입니다.(…),[…]타타: :

    preg_match("[a-zA-Z]+:\s*.$"
                ↑      ↑⬆
    
  • 딜리미터(regex)를 이미 사용하고 있는 .:여기서)는 에스케이프되지 않은 리터럴과 동일한 문자를 포함하고 있습니다.그러면 이 딜리미터는 너무 이른 딜리미터로 오인됩니다.바로 다음 기호에는 "알 수 없는 수식어 ❌" 트로피가 수여됩니다.

    preg_match(":\[[\d:/]+\]:"
                ↑     ⬆     ↑
    
  • 인 「 」를 하고 /구분 기호는 문자 그대로 정규식 안에 넣지 않도록 주의하십시오.이는 이스케이프되지 않은 파일명을 대조하려고 할 때 가장 자주 발생합니다.

    preg_match("/pathname/filename/i"
                ↑        ⬆         ↑
    

    또는 각도/각 괄호 스타일 태그를 일치시키는 경우:

    preg_match("/<%tmpl:id>(.*)</%tmpl:id>/Ui"
                ↑               ⬆         ↑
    
  • 스타일에는 많은 "Smarty" regex "가 필요합니다.{…} ★★★★★★★★★★★★★★★★★」[…]둘 다 합니다.가장 바깥쪽{}아, 아, 아, 아, 아, 아, 아, 아, 아, 아.

    또한 실제 딜리미터를 사용하지 않을 경우 이러한 딜리미터는 쌍을 이룬 딜리미터로 잘못 해석됩니다.그 안에서 문자 그대로도 사용되고 있는 경우는, 물론, 에러입니다.

    preg_match("{bold[^}]+}"
                ↑      ⬆  ↑
    
  • 경고에 "Delimiter는 영숫자 또는 백슬래시일 수 없습니다"라고 표시될 때마다 구분 기호를 완전히 잊어버렸습니다.

    preg_match("ab?c*"
                ↑
    
  • "Unkown 수식자 'g'는 JavaScript 또는 Perl에서 거의 복사된 regex를 나타냅니다.

    preg_match("/abc+/g"
                      ⬆
    

    PHP를 ./g글로벌 플래그대신 이 기능은 모든 발생에서 작동하며, 1 발생에 대한 "글로벌" 검색 펜던트입니다.

    그냥 요./g

    이치노
    · 경고: preg_replace(): 알 수 없는 수식어 'g'
    · preg_replace: 잘못된 regex == '알 수 없는 수정자'?

  • PCRE_EXTENDED 플래그가 더 특이한 경우입니다.이것은 정규식을 보다 높고 읽기 쉽게 하기 위해 자주(또는 사용되어야 한다) 사용됩니다.

    하면 인라인으로 할 수 .#comments.comments.comments.PHP PCRE의 regex의 regex의 regex이다. But it doesn't treat 하지만 그건 치료되지 않아#특별한 방법으로어떤 특별한 방법으로든. Which is how a literal delimiter in a 그래서 리터럴 딜리미터가#댓글이 오류일 수 있습니다.코멘트는 에러가 될 수 있습니다.

    preg_match("/
       ab?c+  # Comment with / slash in between
    /x"
    

    (예: 주)를 사용하여 다음과 같습니다.# as ~하듯이#abc+#x딜리미터는 이중으로 권장되지 않을 수 있습니다.)

  • 변수를 정규식에 삽입하려면 변수를 미리 이스케이프하거나 변수 자체를 유효하게 해야 합니다.이것이 효과가 있을지 어떨지는 미리 알 수 없습니다.

     preg_match("/id=$var;/"
                 ↑    ↺   ↑
    

    이럴 때는 신청하는 것이 가장 좋습니다.

    이치노
    · 알 수 없는 수식자 '/'는...무슨 일이야?

    다른 은 '보다 낫다'를 사용하는 것입니다.\Q…\E따옴표로 둘러싸지 않은 리터럴 문자열의 이스케이프:

     preg_match("/id=\Q{$var}\E;/mix");
    

    이것은 메타 기호에 대한 편리한 단축키일 뿐, 신뢰할 수 있는/안전한 것은 아닙니다.의 경우에 $var를 포함하다'\E'그 자체(그러나 가능성이 낮다).딜리미터 자체를 마스킹하지 않습니다.

  • 사용되지 않는 수식어 /e는 전혀 다른 문제입니다.이는 딜리미터와는 무관하지만 암묵적인 표현식 해석 모드가 단계적으로 종료됩니다.다음 항목도 참조하십시오.사용되지 않는 preg_replace /e를 preg_replace_callback으로 바꿉니다.

대체 정규식 구분 기호

이미 설명한 바와 같이 이 오류에 대한 가장 빠른 해결책은 구분 기호를 선택하는 것입니다.문자가 아닌 모든 기호를 사용할 수 있습니다.시각적으로 구별되는 것이 종종 선호됩니다.

  • ~abc+~
  • !abc+!
  • @abc+@
  • #abc+#
  • =abc+=
  • %abc+%

, 「 」를 할 수 있습니다.$abc$ ★★★★★★★★★★★★★★★★★」|abc|구분자로 지정합니다.그러나 정규식 메타 문자로 사용되는 기호 자체는 피하는 것이 좋습니다.

the#, 은 '아', '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.x/PCRE_EXTENDED이렇게 쓰면 안 .# inline ★★★★★★★★★★★★★★★★★」(?#…)구분자로 혼동될 수 있기 때문에 코멘트를 입력합니다.

따옴표만 구분 기호

눈에 " ★★★★★★★★★★★★★★★★★」'PHP 의 conterpart 의 regex 의 conterpart 의 regex 의 conterpart 의 설정.

  preg_match("'abc+'"
  preg_match('"abc+"'

PHP에 관한 한 그것은 완벽하게 유효하다.편리하고 눈에 띄지 않는 경우도 있지만, IDE나 에디터에서는 항상 읽을 수 있는 것은 아닙니다.

쌍으로 구분된 구분 기호

흥미로운 변동은 쌍으로 구성된 구분 기호입니다.에 같은 임의의 할 수 .<...> (...) [...] {...}★★★★★★★★★★★★★★★★★★★★★★

  preg_match("(abc+)"   # just delimiters here, not a capture group

대부분의 경우 정규식 메타 문자 역할도 하지만 추가 작업 없이 사용할 수 있는 경우가 많습니다.정규식 내의 특정 가새/패런이 올바르게 페어링되거나 이스케이프되어 있는 한, 이러한 변형은 매우 읽기 쉽습니다.

고급 정규식 구분 기호

다소 게으른 트릭(본서에 의해 보증되지 않음)은 인쇄 불가능한 ASCII 문자를 구분자로 사용하는 것입니다.이것은 regex 문자열에 큰따옴표를 사용하여 PHP에서 쉽게 동작하며, 8진수는 구분자로 이스케이프됩니다.

 preg_match("\001 abc+ \001mix"

\001보통 필요하지 않은 제어 문자일 뿐입니다.따라서 대부분의 정규식 패턴 내에서 나타날 가능성은 매우 낮습니다.그래서 여기에도 잘 어울리네요. 잘 읽히지는 않지만요.

도 유니코드 수 .구분자로 지정합니다.PHP를 사용합니다.물어봐줘서 고마워

PCRE 상단의 PHP 구분자

이 함수는 PCRE regex 엔진을 사용합니다.이 엔진 자체는 구분자를 신경 쓰거나 제공하지 않습니다.Perl과의 유사성을 위해preg_*함수에 의해 구현됩니다.따라서 상수 대신 수식 문자를 매개 변수로 사용할 수 있습니다.

regex 문자열의 전처리 방법에 대해서는 ext/pcre/php_pcre.c참조해 주세요.

  • 먼저 선행 공백은 모두 무시됩니다.

  • 영숫자가 아닌 기호는 모두 추정 딜리미터로 간주됩니다.PHP는 단일 바이트 문자만 지원합니다.

    delimiter = *p++;
    if (isalnum((int)*(unsigned char *)&delimiter) || delimiter == '\\') {
            php_error_docref(NULL,E_WARNING, "Delimiter must not…");
            return NULL;
    }
    
  • 오른쪽으로 합니다.regex는 왼쪽에서 오른쪽으로 이동합니다.\\-syslog 기호는 무시됩니다.\Q 도망가는 건 명예롭지 않아

  • 딜리미터가 다시 발견되면 나머지는 한정 문자만 포함하는지 확인합니다.

  • 가 "Delimiter" 중 일 ([{< )]}> )]}>쌍으로 묶을 수 있는 중괄호/중괄호는 처리 로직이 더 정교합니다.

    int brackets = 1;   /* brackets nesting level */
    while (*pp != 0) {
            if (*pp == '\\' && pp[1] != 0) pp++;
            else if (*pp == end_delimiter && --brackets <= 0)
                    break;
            else if (*pp == start_delimiter)
                    brackets++;
            pp++;
    }
    

    올바르게 쌍으로 구성된 왼쪽 및 오른쪽 구분 기호를 찾지만 셀 때 다른 중괄호/브래킷 유형은 무시합니다.

  • raw regex 문자열은 딜리미터 및 수식자 플래그가 컷아웃된 후에만 PCRE 백엔드로 전달됩니다.

이제 이 모든 것은 다소 무관하다.그러나 구분자 경고의 출처는 설명됩니다.이 모든 절차는 최소한의 Perl 호환성을 갖는 것입니다.도 몇 .[…]문자 클래스 컨텍스트가 PHP에서 특별한 처리를 받지 않았습니다.

기타 레퍼런스

「 」 「 」 )를 받고 싶은 경우.MalformedPatternException을 사용합니다.preg_last_error()- T-Regx 라이브러리 사용을 고려합니다.

<?php
try 
{
    return pattern('invalid] pattern')->match($s)->all();
}
catch (MalformedPatternException $e) 
{
    // your pattern was invalid
}

언급URL : https://stackoverflow.com/questions/20705399/warning-preg-replace-unknown-modifier