2010-07-17 3 views
3

그래서, 나는 기본적으로 내부에 아무것도 일치하려고 (포함) 개체 태그를이 함께 해요 :preg_match_all : 왜 "this"가 일치하지만 "that"은 일치하지 않습니까?

<?php preg_match_all('/<object(.*)<\/object>/', $blah, $blahBlah); ?> 

그것은 이것에 대한 일치 찾습니다

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="250" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="250" src="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object> 

을하지만 일치하지 않습니다 이 :

<object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object> 

왜 그런가? 어떤 통찰력에도 감사드립니다.


ETA : 내 접근 방식이 처음부터 잘못되어있을 수 있으므로 여기에 몇 가지 배경이 있습니다.

이것은 Wordpress 사이트 용입니다. shorttag를 전체 비디오 소스 코드로 변환하는 플러그인을 사용하고 있습니다. 플러그인은 최근 (고맙게도) 코드가 더 유효하도록 업데이트되었습니다.

내가 만들려고하는 기능은 단순히 게시물의 첫 번째 비디오 개체를 찾고 사이트의 다른 곳에서 사용하기 위해 붙잡는 것입니다. 여러 라인 대 싱글 마음에 오는

<?php 
function catch_that_video() { 
    global $post, $posts; 
    $the_video = ''; 
    ob_start(); 
    ob_end_clean(); 
    $output = preg_match_all('/<object(.*)<\/object>/', $post->post_content, $vid_matches); 
    $the_video = $vid_matches [1] [0]; 
    if(empty($the_video)){ $the_video = 0; } 
    return $the_video; 
} 
?> 
+1

둘 다 나와 일치하는 것처럼 보입니다. 어쩌면 정규 표현식에's' 플래그를 추가해보십시오. 나는 http://gskinner.com/RegExr/ 테스팅/디버깅을 위해 훌륭하다고 생각한다. –

+3

정규 표현식으로 HTML을 구문 분석하려고하는 이유는 무엇입니까? – HoLyVieR

+1

HTML 파서를 사용하십시오. 왜? 문자열 " ... ..."을 고려하십시오. – Schwern

답변

1

유일한 :

여기에 전체 기능 (당신은 워드 프레스로 작업 한 경우 그 중 일부는 이해가됩니다)입니다.

/<object(.*)<\/object>/m 

여러 줄에 걸쳐 일치해야합니다.

가 업데이트

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

:, m가 (수동)에서 올바른 개질제 상기 조사 결과

아니다 :

미터 (

이 매뉴얼 페이지 수식 논의 PCRE_MULTILINE) 기본적으로 PCRE는 제목 문자열을 단일 " 줄 문자 "(실제로는 에 여러개의 새 줄이 있습니다). 메타 문자 (^)는 문자열 시작 부분에서만 일치하지만 " 줄 끝"메타 문자 ($)는 문자열 끝에 또는 줄 바꿈 (D 수정 자 이 설정되어 있지 않은 한). 이것은 Perl과 같습니다. 이 수정자가 설정되면 은 "라인의 끝이"매우 시작과 끝에서뿐만 아니라 아니라, 즉시 각각 대상 문자열의 모든 줄 바꿈 앞에 바로 다음 경기 또는 를 구축 "라인의 을 시작" . 이것은 Perl의/m 한정자와 동일한 입니다. 제목 문자열에 "\ n"문자가 없거나 패턴에^ 또는 $가없는 경우이 수정자를 설정해도 아무런 효과가 없습니다.

(강조 내 자신.)

올바른 수정이 점 메타 문자 .가 개행 문자와 일치 할 수 있도록 할 s 될 것이다.

업데이트 된 질문으로 이동하면 입력이 단순 문자열 인 경우 정규식 자체가 두 입력과 ​​일치합니다. 나는 실제 문제의 원인을 알지 못한다. 당신이이 두 라인을 달성하기 위해 노력하고있다

:

$input = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="250" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="250" src="http://vimeo.com/moogaloop.swf?clip_id=9048799&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object>'; 

$input2 = '<object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5630744&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>'; 

$matches = array(); 
preg_match_all('/<object(.*)<\/object>/', $input, $matches); 
echo '<br />$input<pre>'; 
var_dump($matches); 
echo '</pre>'; 

$matches2 = array(); 
preg_match_all('/<object(.*)<\/object>/', $input2, $matches2); 
echo '<br />$input2<pre>'; 
var_dump($matches2); 
echo '</pre>'; 

에 이동?

ob_start(); 
ob_end_clean(); 

이렇게하면 새로운 출력 버퍼가 열리고 즉시 삭제됩니다. (documentation에 출력 버퍼를 스태킹하는 방법에 대한 비트를 참조하십시오. null 대신이 값을 0으로 설정하는 이유가 있습니까?

if(empty($the_video)){ $the_video = 0; } 

개인적으로, 나는 그것을 선언 할 때 null로 설정하고 어떤 일치가없는 경우 있음을 건드리지하지에 의존하는 것이다. 이것은 $post이 WordPress 글로벌이라고 가정하고 그 함수를 작성하는 방법입니다. (나는 대부분의 전역에 대한 경멸을 가지고 개인적으로, 난 그냥 함수로 되었 것이다.) 당신이 첫 번째 일치를 사용하고 있기 때문에 그것을 대신 preg_match_allpreg_match을 사용하도록 변경

function catch_that_video() 
{ 
    global $post; 

    $the_video = null; 
    $vid_matches = array(); 

    if(preg_match('/<object.*<\/object>/', $post->post_content, $vid_matches)) 
    { 
    $the_video = $vid_matches[0]; 
    } 

    return $the_video; 
} 

. 물론 필요한 경우 preg_match_all을 사용하도록 수정할 수 있습니다. 그래도 적절한 정규 표현식은 만드는 고통이 될 것입니다. (s 수정자를 여러 줄을 처리하기 위해 위의 정규식에 추가하면 첫 번째 열기 <object> 태그부터 마지막 ​​닫는 </object> 태그까지 모든 것을 얻을 수 있습니다. 정규식을 다루려는 생각조차하지 않으려합니다. 여러 라인을 잡고 개별적으로 <object>...</object> 블록을 입력하십시오.)

그러나 두 번째 오브젝트 블록이 일치하지 않는 이유는 원래 질문에 대한 대답이 아닙니다. 나는 두 문자열 사이의 차이점을 발견하려고 노력하면서 내 조사에 집중할 것입니다. 문제가 줄 끝의 차이점이라면 Linux의 VIM과 같은 것을 사용합니다. 줄 끝의 \ r 대신 \ ^이 표시됩니다. 문자열의 html 인코딩은 어떻습니까? 가능한 문제 일 수 있습니까?

+0

그러나 그 입력의 * 두 *는 여러 줄을 사용하지 않습니까? –

+0

@Rob Kennedy이 입력에서는 입력 내용이이 질문에 제시된대로 지정되어 있다고 가정합니다. (나쁜 가정이 아닙니다.) 정규 표현식이 둘 다 작동하지 않는 이유를 생각해 낼 수 없을 때, 나는 그 가정을 창 밖으로 던지기로 결정했습니다. –

+0

고마워, 그 수식어가 작동하지 않았지만, 다른 수식이 적용될 수 있는지 확인하고 있습니다. 하지만, 어쨌든 처음부터 나의 접근 방식이 잘못되었음을 알기 시작했습니다. – Kerri