2011-07-04 2 views
0

PHP에서 regexp을 사용하는 데 문제가 있습니다. 그것은 웹 페이지의 태그 사이에 문자열을 가져 오지 만, 반향을 얻으려고하면 배열을 반향 시키려고합니다.PHP에서 작동하는 정규식을 가져올 수 없습니다. 그냥 배열 단어를 출력합니다.

이것은 regexp를 사용중인 텍스트입니다. 문자열로 다운로드 된 웹 페이지의 일부입니다.

<title> 
HTC Desire S 
</title> 

이것은 정규 표현식에 사용하는 코드입니다.

while(!feof($list_of_phones)) 
{ 
     $phone = fgets($list_of_phones); 
     $info = file_get_contents($phone); 
     preg_match_all("/\/<title>(.*)<\/title>/", $info, $title, PREG_OFFSET_CAPTURE); 
     echo $title[0]; 
} 
+0

'preg_match_all' 대신'preg_match'를 시도하십시오. – hakre

+0

정규 표현식으로 HTML을 구문 분석하려는 것 같습니다. 왜 이것이 나쁜 생각인지이 질문을 참조하십시오. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+2

더 쉬운 방법이 있다는 것을 알고 있습니까? [DOMDocument] (http://lv.php.net/manual/en/class.domdocument.php)와 같은 클래스를 사용하여 html/xml 문서의 내용? –

답변

2

manual page을주의 깊게 읽어보십시오. 세 번째 인수는 다차원 배열으로 채워집니다. var_dump()을 사용하여 변수를 검사 할 수 있습니다.

1

pre_match_all()

$matches 항상 multdimensional 어레이 (일반적으로 2 레벨)이다. PREG_OFFSET_CAPTURE -flag를 설정하면 그 결과도 한 단계 더 깊어집니다.

PREG_OFFSET_CAPTURE 이 플래그를 넘기면,마다 위치도 반환합니다 문자열과 일치 발생. 에서 상기 디버깅 1.

echo $title[0][0][0]; 

오프셋이 모든 요소가 0 오프셋 및 문자열이 피사체에 대한 오프셋에서의 배열이 일치하는 문자열로 이루어지는 것이다 배열에 일치하는 값을 변경 참고 : 전혀 사용하지 echo 인 경우 var_dump() 또는 print_r()을 대신 사용하십시오. 이것은 많은보다 echo보다 자세한 정보를 제공합니다. 내가 바로 <title> 전에이도 (\/에 의해 지정됨) /를 기대 볼 수

은 그럼 당신은 지금까지이 정규식을

/\/<title>(.*)<\/title>/ 

를 사용합니다. 나는 이것이 당신이 원하는 것,이라고 생각하지 않습니다. (우리는 더 분명, 여기에 다른 구분 기호를 선택하면 : ~/<title>(.*)</title>~)

0

첫 번째 문제 : 귀하의 정규식이에 슬래시가 나타납니다 :

당신 거기있어 왜
/\/<title>(.*)<\/title>/ 
^^ 

확실하지,

/<title>(.*)<\/title>/ 

두 번째 문제 :하지만 난이해야한다고 생각 당신이 그 권리를 취득하는 경우에도, $title[0] 여전히 배열 될 것입니다; 전체 <title>content</title> 문자열을 얻으려면 $title[0][0]이 필요하고 <title> 태그 내부에는 텍스트가 들어가려면 $title[1][0]이 필요합니다.

희망이 있습니다.

0

먼저 정규 표현식에 오류가있는 것으로 보입니다. 즉, 초기 \/입니다.

둘째, $title[0]에는 찾고있는 것이 포함되어 있지 않습니다. print_r (또는 이와 유사한 것)을 $title에 적용하면 관련성이있는 부분이 표시됩니다.

관련 문제