2009-12-02 3 views
0

나는 두 HTML 태그 사이에 슬래시가있는 날짜를 preg_match_all하려고합니다. 그러나 그것의 반환 널.PHP preg_match_all 슬래시가있는 html 날짜 오류

> <td width='40%' align='right'class='SmallDimmedText'>Last Login: 11/14/2009</td> 

가 여기 내으로, preg_match_all() 코드 $ h를 위의 HTML이다

preg_match_all('/<td width=\'40%\' align=\'right\' class=\'SmallDimmedText\'>Last([a-zA-Z0-9\s\.\-\',]*)<\/td>/', $h, $table_content, PREG_PATTERN_ORDER); 

입니다 : 여기

는 HTML입니다.

무엇이 잘못 되었나요? 사전에
감사

답변

3

당신이 일치하는 것을 시도하고 있기 때문에 (빠른 눈에서) 때문이다 :

Last([a-zA-Z0-9\s\.\-\',]*) 

이 정규식은 필요가 없습니다 :이 정규 표현식으로

Last Login: 11/14/2009 

문자는 :/이며 텍스트 문자열에 포함됩니다. 에 정규식의 필요한 부분을 변경 :

Last([a-zA-Z0-9\s\.\-\',:/]*) 

것은 일치를 제공합니다

는 단순히 DOM parser을 사용하고 DOM 조회의 결과에 정규식을 미리 형성하는 것이 더 있을까? 그것은

편집

다른 문제는 HTML이 있다는 것입니다 ... 더 좋은 정규식있게 :

... 40 % right'class의 = 'SmallDimmedText'> '= 정렬'을. .. 정렬 = '권리'와 클래스 사이에 공백이없는

은 = 'SmallDimmedText'는

그러나 그 부분에 대한 정규식은 다음과 같습니다

... 40 % \ 'align = \'right \ 'class = \'SmallDimmedText \ '> ...

표시되는 곳에 공백이 있습니다.

DOM 구문 분석기을 사용하면 계산할 수없는 것보다 미묘한 버그로 인한 두통을 줄일 수 있습니다.

단순 HTML DOM을 사용하여 구문 분석하는 것이 얼마나 간단한 지에 대한 아이디어를 제공하기 만하면됩니다.

$html = str_get_html(...); 
$elems = $html->find('.SmallDimmedText'); 
if (count($elems->children()) != 1){ 
    throw new Exception('Too many/few elements found'); 
} 
$text = $elems->children(0)->plaintext; 

//parsing here is only an example, but you have removed all 
//the html so that any regex used is really simple. 
$date = substr($text, strlen('Last Login: ')); 
$unixTime = strtotime($date); 
1

나는 적어도 두 가지 문제를 참조하십시오

당신의 HTML 문자열
  • , 'right'class= 사이에 공간이 없다을 하나 개의 공간은 정규식에 거기에 당신이에 추가해야합니다
  • [] 사이에 일치하는 문자 목록에 이상이 3 자 :
    • ':',
    • 와 ':
    • ' '(""그리고 날 "마지막"와,와 사이에 "로그인"사이의 공백이) ("로그인"와 날짜 사이에 존재하는) / '(사이의 날짜 부분)이 코드

, 잘 작동하는 것 같다 :

$h = "<td width='40%' align='right'class='SmallDimmedText'>Last Login: 11/14/2009</td>"; 
if (preg_match_all("#<td width='40%' align='right'class='SmallDimmedText'>Last([a-zA-Z0-9\s\.\-',: /]*)<\/td>#", 
     $h, $table_content, PREG_PATTERN_ORDER)) { 
    var_dump($table_content); 
} 
0 에, 슬래시 문자열 구분 기호로
  • "
  • 을 탈출하는 것을 방지하기 위해 정규식 구분 기호로

    • # :

      array 
          0 => 
          array 
           0 => string '<td width='40%' align='right'class='SmallDimmedText'>Last Login: 11/14/2009</td>' (length=80) 
          1 => 
          array 
           0 => string ' Login: 11/14/2009' (length=18) 
      


      참고 나는 또한 사용했다 :

      나는이 출력을 얻을 작은 따옴표를 피할 필요가 없다.

    1

    첫 번째 제안은 preg_match_all에있는 텍스트의 양을 최소화하는 것입니다. 왜 ">"와 "<"사이에해야합니까? 도움이된다면 둘째, 나는 확실하지,이 같은 정규식을 작성 끝장 :

    다음 하나 개의 태그, 모든 문자, 다음 날짜, 다른 태그의 다음 시작의 끝을 찾을 것이다
    />.*[0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}</ 
    

    .

    1

    야코비에 동의합니다. 최소한

    는 HTML의 특정의 모든 참조를 제거하고 단순히 정규식

    preg_match_all('#Last Login: ([\d+/?]+)#', ... 
    
    를 만들