2010-05-24 2 views
0

PHP 및 Zend Framework를 사용하여 JMS 대기열에서 데이터를 가져 오는 프로젝트를 진행 중입니다. HTTP 클라이언트 응답은 다음과 같습니다. XML 문자열 만 있으면됩니다.PHP의 응답 본문에서 정규식 XML 데이터 가져 오기에 대한 도움말

http://gskinner.com/RegExr/에서 ok를 테스트하지만 preg_match 호출이 빈 matches 배열을 반환하는 /(.*) </RequestDetails>/gs가 나타납니다.

패턴을 찾기 위해 계속 사냥을 할 예정이지만 여기에도 게시 할 것입니다. 등 읽는 모든 사람에게

감사합니다 ...

스티브

업데이트 : 내가 제대로 붙여 넣을 코드를 얻을 수 없습니다. 다음은 pastbin에 대한 링크입니다. http://pastebin.com/rQxzcfSg

답변

1

다음 코드 :

<?php 

$text = <<<EOT 

blah blah <0> 
<RequestDetails><1><2><3>test</RequestDetails> 
<RequestDetails><4><5><6>blah 
more blah blah 
</RequestDetails> 
blah blah <7> 


EOT; 

print $text; 

preg_match_all('/<RequestDetails>(.*?)<\/RequestDetails>/s', $text, $matches); 

print_r($matches); 

?> 

이 출력을 생성합니다 :

blah blah <0> 
<RequestDetails><1><2><3>test</RequestDetails> 
<RequestDetails><4><5><6>blah 
more blah blah 
</RequestDetails> 
blah blah <7> 

Array 
(
    [0] => Array 
     (
      [0] => <RequestDetails><1><2><3>test</RequestDetails> 
      [1] => <RequestDetails><4><5><6>blah 
more blah blah 
</RequestDetails> 
     ) 

    [1] => Array 
     (
      [0] => <1><2><3>test 
      [1] => <4><5><6>blah 
more blah blah 

     ) 

) 

내가 대신 /g 플래그의 preg_match_all를 사용했습니다를, 또한 당신이 원하는 것을 정말 (.*?) 꺼려 일치를 사용 여러 경기를 얻으십시오.

차이점을 확인하려면 다음 텍스트에 두 개의 A.*?Z 일치 항목이 있지만 하나만 A.*Z입니다.

---A--Z---A--Z---- 
    ^^^^^^^^^^^ 
     A.*Z 

즉, 정규식을 사용하여 XML을 구문 분석하는 것은 좋지 않습니다. 적절한 XML 구문 분석기를 사용하십시오. 그것은 당신의 삶을 훨씬 쉽게 만들어 줄 것입니다.

0

PHP 5에 SimpleXML과 같은 온보드 도구가 포함되어있을 때 복잡한 Regexes를 사용하는 이유는 무엇입니까?

$xml = simplexml_load_string($string); 

print_r($xml); // should output complete tree for you to walk through easily 

MIME 부분을 제거하고 원시 XML 만 함수에 제출하면됩니다.

자세한 내용은 SimpleXML 여기에 있습니다.

+0

동의하지만 HTTP 응답에 필요한 XML보다 많은 데이터가 포함된다는 점이 문제입니다. XML을 응답에서 빼낸 다음 SimpleXML에 문자열을로드해야합니다. – spdaly

+0

@ spdaly okay. XML이 명확하게 정의되어 있다면, 정규식이 여기로 갈 수있는 방법 일 수 있습니다. –

0

g은 유효하지 않습니다. 대신 m을 사용하십시오 (여러 줄의 경우). /(.*)<\/RequestDetails>/gs/(.*)<\/RequestDetails>/msthis tester을 사용하여 테스트하십시오.

관련 문제