2016-06-26 1 views
0

있어 사이트와 일치 doen't ungreedy : 나는 preg_match()JSON하지만 ...PHP 아무것도에게 그런 일이

하여 사용하는 경우에는 것을 얻기 위해 노력하고

<html ... data-props="{some_json_data_with_html_entities}" ...>

을 :

'~data-props="(.*)"~'

나는 모든 것을 얻고 있습니다. 나는 더 많은 것이 있다는 것을 의미합니다. 그것이 모두를 잡는다 있도록 ""를 포함하는 라인의 ...

그러나 사용 :

'~data-props="(.*)"~U'

나는 결과에 아무것도 ... 하늘의 배열을 얻을 수 없습니다.

무슨 일입니까? 올바르게 일치시키는 방법은 무엇입니까?

+0

https://www.regex101.com/r/hV2qA2/2 – splash58

+0

내 코드를 붙여 넣을 때 ungreedy로 "제한 시간"이라고 말하면서 탐욕 스럽습니다. –

+0

코드가 내가 좋아하는 코드입니까? – splash58

답변

0

대신에 JSON 파서를 사용해야 할 것입니다.하지만 작동하지 않는 이유 (예 2)를 알고 싶다면 신비입니다. lazy과 일치 시키려면 U 한정자를 ? 한정 기호없이 사용하면 일치시킵니다. 실제 PHP 코드의 모양이 명확하지 않습니다. 두 번째 패턴은 입력 문자열에 따라 일치해야합니다.

data-props="(.+?)" 

+? [게으른] 1 ~ ∞ 시간을 가능한 한 수만큼 일치 시키며 필요에 따라 을 확장합니다. 여기 https://www.regex101.com/r/cL9xU9/1

은 겉으로는 잘 두 번째 패턴을 사용하여 preg_match의 빠른 예제 :

$str = '<html ... data-props="{some_json_data_with_html_entities}" ... 
     "{some__moar_json_data_with_html_entities}">'; 
preg_match('~data-props="(.*)"~U', $str, $res) ; 
print_r($res[1]); 

결과 :

{some_json_data_with_html_entities} 

그것은 다음했습니다 일치하지 않는 것 경우 분명히 문자열에서 더 많은 것을 얻었습니다. ve 주어진.

+0

json 파싱은 괜찮지 만 처음에는 JSON 문자열을 가져와야합니다 ... 예를 들어 regex101.com에서 U 스위치가 켜지면 타임 아웃이 표시됩니다 ... 문자열이 너무 커서 정확하게 일치하지 않습니까? –

관련 문제