2016-10-06 3 views
0

나는 HTML 코드의 조각이 있습니다정규식까지 일치하는 단어 "흔한"

<tr style="padding:0;vertical-align:top;text-align:left"> 
          <td style="word-break:break-word;border-collapse:collapse;padding:5px 10px;vertical-align:top;text-align:left;color:rgb(51,51,51);font-family:Helvetica,Arial,sans-serif;font-weight:bold;margin:0;line-height:19px;font-size:14px;width:270px;border-bottom:1px dotted rgb(212,212,212);border-left:none"> Traveler email </td> 
          <td style="word-break:break-word;border-collapse:collapse;padding:5px 10px;vertical-align:top;text-align:left;color:rgb(51,51,51);font-family:Helvetica,Arial,sans-serif;font-weight:normal;margin:0;line-height:19px;font-size:14px;width:270px;border-bottom:1px dotted rgb(212,212,212)"> 
          <div align="right"> 
          <a href="mailto:[email protected]" style="color:rgb(42,110,187);text-decoration:none" target="_blank">[email protected]</a> 
          </div> </td> 
          </tr> 

내가 여행자의 이메일 주소를 잡아하고자합니다. 나는 약간의 이메일 주소가 있기 때문에 단어 mailto에 바로 정규식을 적용 할 수 없다. 그래서 내가 정규식을 Traveler email에서 시작하면 더 구체적이라고 생각한다.
이것은 내가 만들어 놓은 식입니다

/Traveler\semail+([^mailto:]+)/ 

그러나 그것은 작동하지 않습니다.
귀하의 조언을 부탁드립니다. 감사합니다.

+0

'email +'와'[^ mailto :]'는 그들이하는 일을 생각하지 않습니다. – Biffen

+0

가능한 [정규 표현식 학습] (http://stackoverflow.com/questions/4736/learning-regular-expressions)의 중복 가능 – Biffen

+0

@biffen 나는 놓쳤다. 고마워. –

답변

0

당신의 접근 방식 중 몇 가지 문제는 "DOTALL"플래그를 사용하여 패턴을 여러 줄 발췌 문장에 적용하고 "mailto"다음에 실제 전자 메일 주소를 캡처하지 않아야합니다. 다른 주석가들이 지적했듯이 패턴에도 기본 정규식 구문 문제가 있습니다. 여기에 당신이 원했고 유익한 것으로 생각하는 것을 수행하는 작은 PHP 파일이 있습니다. 예제에서 "snippet.txt"는 PHP 스크립트에 로컬이고 샘플 HTML을 포함합니다.

<?php 
$myfile = fopen("snippet.txt", "r") or die("Unable to open file!"); 
$contents = fread($myfile,filesize("snippet.txt")); 
fclose($myfile); 
$pattern = '/Traveler\s+email.*?mailto:(.*?)"/s'; 
preg_match($pattern,$contents,$matches); 

print_r($matches); 
?> 

와 명령 줄에서이 작업을 실행 :

php -f thescript.php 

당신은 결과를 얻을 :

Array 
(
    [0] => Traveler email </td> 
          <td style="word-break:break-word;border-collapse:collapse;padding:5px 10px;vertical-align:top;text-align:left;color:rgb(51,51,51);font-family:Helvetica,Arial,sans-serif;font-weight:normal;margin:0;line-height:19px;font-size:14px;width:270px;border-bottom:1px dotted rgb(212,212,212)"> 
         <div align="right"> 
         <a href="mailto:[email protected]" 
    [1] => [email protected] 
) 

패턴 :

$pattern = '/Traveler\s+email.*?mailto:(.*?)"/s'; 

가 함께 DOTALL 플래그를 설정 "s"는 끝에, 그리고 "게으른"sy를 사용합니다. ntax : ". *?" 모든 문자를 "?"다음에 오는 문자까지만 일치시킵니다. DOTALL이 없으면 ". *?" 개행을 교차시키지 않으며, 당신은 아무런 일치도 얻지 못할 것입니다.

+0

안녕하세요. 작동 할 수 있습니다. 마지막's' 문자는 무엇입니까? 고맙습니다. –

+0

s는 "DOTALL"플래그를 설정하는 "패턴 수정 자"입니다. 자세한 내용은 [here] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php)를 참조하십시오. 이런 식으로 여러 플래그를 설정할 수 있습니다. 예를 들어 "s"를 "si"로 바꾸면 패턴은 대소 문자를 구분하지 않습니다. –

+0

소스에 감사드립니다. –