(실무예제) 다음 메인페이지에서 실시간 이슈 부분을 가져오기

개인적인 일로 오랫동안 정규표현식 강좌를 이어가지 못하였습니다.

오랜만에 워밍업 개념으로 간단한 실무 예제를 한번 만들어 보았습니다.




※ 일단, 다음(http://www.daum.net/) 메인의 html 내용이 $html 변수에 저장되어있다고 가정하고 시작합니다.
분석을 할때는 브라우져로 다음을 열어놓고 소스보기를 통해서 보시면 됩니다.




1. 먼저 소스에서 뽑고자 하는 실시간 이슈가 나오는 부분을 찾습니다.
......
<div id="realTime" class="issuerank">
<h3 id="issueRankTitle" class="tab"><span class="ir"><span class="ir_desc">실시간 이슈</span></span></h3>
<ol id="issueRank" class="#searchrank">
<li class="rank_li #issue"><div class="rank first"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EC%98%81%ED%99%94%EB%B0%B0%EC%9A%B0+%EC%9A%B0%EB%B4%89%EC%8B%9D&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@1">영화배우 우봉식</a><span class="status new">new</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=kt+%EC%A0%95%EB%B3%B4%EC%9C%A0%EC%B6%9C+%EC%86%8C%EC%86%A1&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@2">kt 정보유출 소송</a><span class="status up">54</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EA%B9%80%EA%B8%B0%EC%B2%9C&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@3">김기천</a><span class="status up">40</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EA%B0%A4%EB%9F%AD%EC%8B%9C%EB%85%B8%ED%8A%B8+%EB%B0%B0%ED%84%B0%EB%A6%AC%EA%B5%90%ED%99%98&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@4" title="갤럭시노트 배터리교환">갤럭시노트 배터리..</a><span class="status up">45</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EC%9D%B4%EB%B3%B4%EC%98%81+%EC%95%BC%EC%83%81&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@5">이보영 야상</a><span class="status up">44</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EC%A0%95%EC%95%84%EC%9C%A8&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@6">정아율</a><span class="status up">46</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EB%8C%80%EC%A1%B0%EC%98%81+%ED%8C%94%EB%B3%B4&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@7">대조영 팔보</a><span class="status up">387</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=kt+%EC%A0%95%EB%B3%B4%EC%9C%A0%EC%B6%9C+%EC%A7%91%EB%8B%A8%EC%86%8C%EC%86%A1+%EC%B9%B4%ED%8E%98&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@8" title="kt 정보유출 집단소송 카페">kt 정보유출 집..</a><span class="status up">54</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EA%B3%B5%EC%9D%B8%ED%96%89%EC%A0%95%EC%82%AC&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@9">공인행정사</a><span class="status up">27</span><span class="daumhide">상승</span></div></li>
<li class="rank_li #issue"><div class="rank"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EB%AA%BD%EA%B3%A0%EB%B0%98%EC%A0%90&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@10">몽고반점</a><span class="status up">25</span><span class="daumhide">상승</span></div></li>
</ol>
......


2. 내가 필요한 부분만 짤라내기 위해 html 전체에서 중복되지 않는 조건을 찾습니다.

일반적으로 id 는 문서내에서 중복되지 않는 것이 원칙입니다.
위의 발췌된 부분에서는
<ol id="issueRank" class="#searchrank"> ~  </ol>
부분입니다.

id 는 중복되지 않는 부분이므로 반드시 들어가야 하는 부분이고,
class 부분은 디자인이 조금씩 수정될때 마다 추가 될수 도 있고 빠질수도 있는 부분입니다.

문자열 내부에 " 사용되었으므로 \(에스케이프)를 사용하지 않기 위해서 패턴은 ' 으로 감쌉니다.
패턴구분자는 " ' 을 제외하고 나머지 잘 사용되지 않는 문자를 사용합니다.
저같은 경우는 ` 을 주로 쓰는 편입니다.
그리고 내용에 줄바꿈이 있으므로 패턴변경자로는 s 를 사용합니다.

따라서 패턴은
'`<ol[^>]+id="issueRank"[^>]*>(.+?)</ol>`s';
와 같이 만들어 집니다.

<ol[^>]+id  이렇게 한것은
ol 과 id 사이에 클래스나 다른 것들이 들어올 가능성이 있기 때문입니다.
[^>]* 으로 해도 되지만 [^>]+ 한 이유는 반드시 공백이라도 들어가야 하기 때문이고
olid 이렇게 겹친경우를 방지 하기 위해서 입니다.

(.+?) 이것은 .+ 한것을 찾되 전체 패턴에서 최초로 일치하는 선까지만 찾겟다는 것입니다.
현재 다음 내용에서는 </ol>이 한번밖에 사용되지 않았지만,
다른 내용이 추가 되어 그 뒤로 </ol> 이 여러번 있을 경우를 대비하는 것입니다.

preg_match('`<ol[^>]+id="issueRank"[^>]*>(.+?)</ol>`s', $html, $m1);

print_r($m1);


3. 1차적으로 잘라온 문자열에서 자신이 필요한 정보들을 모두 뽑습니다.

필요한 정보들을 모두 뽑으니까 preg_match_all 을 사용합니다.

필요한 정보들은
<li class="rank_li #issue"><div class="rank first"><a href="http://search.daum.net/search?w=tot&amp;rtupcate=issue&amp;q=%EC%98%81%ED%99%94%EB%B0%B0%EC%9A%B0+%EC%9A%B0%EB%B4%89%EC%8B%9D&amp;guide=rissue&amp;rtupcoll=DQP,NNS&amp;DA=ATGF" class="@1">영화배우 우봉식</a><span class="status new">new</span></div></li>
이러한 형태를 가지는데,
경우에따라 class 부분이 다르거나 하는 경우가 존재합니다.
첫번째것의 경우에는 <div class="rank first"> 와 같이  first 가 추가로 더 들어간것처럼 말입니다.

패턴은
'`<li[^>]*><div[^>]*><a[^>]+href="([^"]+)"[^>]*>(.+?)</a><span class="status([^"]*)">(.*?)</span>`'
이런식으로 만들면 되는데,
패턴 문자열을 싸는 것은 위와 마찬가지로 ' 를 사용하고
패턴 구분자는 ` 을 사용하였습니다.

모두 li 로 싸여 있기 때문에 <li[^>]*> 로 했습니다.
li 외에 id 나 class 등이 있던 없던 상관이 없다는 뜻입니다.

<div[^>]*> 이것 역시 마찬가지의 의미입니다.

<a[^>]+href="([^"]+)"[^>]*> 이렇게 한 이유는 링크만 필요하고 나머지 문자열에는 영향을 받지 않기 위해서입니다.

(.+?) 이것역시 위에서 설명했듯이 최초로 일치하는 것까지만 찾기 위해서입니다.
? 를 붙이지 않으면 맨뒤의 </a> 앞에 까지가 매치되어집니다.

<span class="status([^"]*)">(.*?)</span> 이부분은 키워드의 순위 변동사항을 알려주는 부분인데,
변동사항은 클래스로 알려주기 때문에 특정 클래스를 따로 뽑기 위해서 사용하였습니다.


preg_match_all('`<li[^>]*><div[^>]*><a[^>]+href="([^"]+)"[^>]*>(.+?)</a><span class="status([^"]*)">(.*?)</span>`', $m1[1], $m2);

print_r($m2);

|

댓글 10개

제가 정규식을 잘 못하는데 항상 유창화님의 강의를 보며 하나하나 지식을 쌓고 있습니다! 감사합니다!
도움이 된다니 기분이 좋군요!!

감사합니다.
실전 강좌로 하니 머리속에더 팍팍꼬치네요.
현업 개발자에게도 많은 도움이되는 강좌!!
그래도 기초공부가 선행되야돼!
알파벳도 모르고 영어단어나 숙어를 사용할수는 없는 것이니.......

암튼 좋다니 다행이네.
해도 해도 어려운게 정규 표현식인데

유창화님 의 강의 덕에 지속적으로 공부하게 되네요.

앞으로도 잘 부탁드리겠습니다.^^
네에
성의껏 해보도록 하겠습니다.
감사합니다.
알기 쉽게 잘 설명하시네요.. 이것도 능력.. ^^
감사합니다.
네 알기 쉽다니 다행입니다.
감사합니다.
정규식 표현이 사실 보면 볼수록 어려워서 간단한 것들만 쓰고, 조금 길면...포기 했었는데...
유창화 회원님의 도움으로 하나 하나 지식을 쌓아가는 느낌 입니다. 진심으로 좋은 정보 남겨 주셔서 감사의 말씀을 드립니다.
네에 감사합니다.
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
11년 전 조회 1,087
11년 전 조회 1,336
11년 전 조회 1,164
11년 전 조회 611
11년 전 조회 749
11년 전 조회 637
11년 전 조회 5,082
11년 전 조회 580
11년 전 조회 600
11년 전 조회 3,056
11년 전 조회 906
11년 전 조회 4,452
11년 전 조회 1,823
11년 전 조회 2,638
11년 전 조회 572
11년 전 조회 594
11년 전 조회 1,463
11년 전 조회 645
11년 전 조회 1,614
11년 전 조회 1,586
11년 전 조회 4,472
11년 전 조회 982
11년 전 조회 2,139
11년 전 조회 1,420
11년 전 조회 1,452
11년 전 조회 1,532
11년 전 조회 768
11년 전 조회 1,624
11년 전 조회 484
11년 전 조회 3,772
11년 전 조회 1,864
11년 전 조회 1,671
11년 전 조회 1,311
11년 전 조회 6,828
11년 전 조회 1,281
11년 전 조회 874
11년 전 조회 2,373
11년 전 조회 1,715
11년 전 조회 834
11년 전 조회 1,233
11년 전 조회 2,613
11년 전 조회 1,982
11년 전 조회 1,814
11년 전 조회 2,105
11년 전 조회 2,378
11년 전 조회 3,152
11년 전 조회 2,718
11년 전 조회 2,817
11년 전 조회 3,528
11년 전 조회 3,289
11년 전 조회 695
11년 전 조회 4,187
11년 전 조회 5,194
11년 전 조회 914
11년 전 조회 2,126
11년 전 조회 1,299
11년 전 조회 639
11년 전 조회 1,032
11년 전 조회 687
11년 전 조회 2,694
11년 전 조회 1,676
11년 전 조회 685
11년 전 조회 820
11년 전 조회 1,213
11년 전 조회 849
11년 전 조회 918
11년 전 조회 846
11년 전 조회 834
11년 전 조회 733
11년 전 조회 880
11년 전 조회 875
11년 전 조회 820
11년 전 조회 3,128
11년 전 조회 1,279
11년 전 조회 550
11년 전 조회 643
11년 전 조회 2,100
11년 전 조회 1,234
11년 전 조회 879
11년 전 조회 636
11년 전 조회 1,012
11년 전 조회 606
11년 전 조회 1,566
11년 전 조회 1,074
11년 전 조회 465
11년 전 조회 793
11년 전 조회 1,780
11년 전 조회 1,624
11년 전 조회 1,147
11년 전 조회 571
11년 전 조회 1,160
11년 전 조회 534
11년 전 조회 2,582
11년 전 조회 1,387
11년 전 조회 1,501
11년 전 조회 652
11년 전 조회 453
11년 전 조회 2,651
11년 전 조회 976
11년 전 조회 431
🐛 버그신고