2016-10-03 3 views
1

를 역 추적 : 내 사이트를 충돌 어떤 이유로치명적인 내가 어떤 내 정규식 문제가

if (preg_match_all('/{[a-z]+:ce_img:(single|pair)(\s.*)*}/', $files, $matches)) 
{ 
    echo "ok"; 
} 

합니다. Ofcourse 나는 이미 Google에 시도하고 이것이 "내 문제"인지 확실하지 않지만 "Catastrophic backtracking"에 대해 뭔가를 발견했습니다. {까지 하나 (또는 ​​쌍) 종료 : ce_img 계란}

내가 변경하거나 제거하려고

| 그냥 일반적으로 실행 (한 쌍)

정규식은 나에게 사이의 모든 것을 제공한다. 그래서 그 권리에 관한 것이어야합니까?

저는 $ 파일이 문제가 아닐 것이라고 확신합니다.

누군가이 문제를 해결하는 방법을 알고 있습니까?

감사합니다, Olcan

편집 : 여기 이 정규식이 작동하는 방법의 예 : image

+0

구문 분석하려는 예제 문자열을 제공 할 수 있습니까? –

+0

https://regex101.com/r/PK7dBk/1 –

+0

내가 제공 한 편집을 확인하십시오. 감사! –

답변

0

당신의 정규식 (인해 치명적인 되돌아에) 사이트를 충돌하여 입력 파일을 다음 중 하나 이상이 포함되어 있기 때문에 :

  1. 을 대상 블록 뒤에 여러 공백 문자가 있습니다.
  2. 대상 블록 뒤에 공백이있는 문자 시퀀스입니다. \s.+과 유사합니다.

해결 방법 : 이것은 특별히 패턴과 일치

{[a-z]+:ce_img:(?:single|pair)(?:\s+[\w-]+="[^"]*")*\s*} 

. 마지막 다른 부분에 대한 설명 :

(?:     # Start of non-capturing group (a) 
    \s+[\w-]+="[^"]*" # Match similar following string `attr="value"` 
)*      # Many or zero times - end of non-capturing block (a) 
\s*     # Match all space characters if any, before closing brace `}` 
+2

감사합니다. 이것은 실제로 트릭을했습니다. –

0

이 작동합니다 : 이미지에 표시되는 텍스트를 들어

{[a-z]+:ce_img:(?:single|pair)?([\w\W\s]+)*} 

:

{eggs:ce_img:single 
    src="{src}" 
    fallback_src="/assets/a-b-c.jpg" 
    width="250" 
    height="250" 
    add_dims="no" 
    crop="yes" 
    title="{title}" 
    alt="{title}" 
    allow_scale_larger="yes" 
} 

당신은 얻을 것이다 :

Group 1  src="{src}" 
      fallback_src="/assets/a-b-c.jpg" 
      width="250" 
      height="250" 
      add_dims="no" 
      crop="yes" 
      title="{title}" 
      alt="{title}" 
      allow_scale_larger="yes" 

데모 여기를 참조하십시오 : https://regex101.com/r/uo9Kqi/1

+0

이 정규식이 질문에 대한 답변입니까? @OlcanTeke – revo

+0

사실, 일부 테스트 후에는 {} 내부의 whats를 반환하는 대신 입력 문자열의 첫 번째부터 {끝까지 모든 것을 반환합니다. –

관련 문제