Tags:

ต้องการตัดหัวข้อ ที่เป็นกระทู้แนะนำ ในหน้านี้ค่ะ http://www.pantip.com/cafe/mbk/listerT.php

นี่คือโค๊ด

$url_pantip = "http://www.pantip.com/cafe/mbk/listerT.php";
$pattern =
$data_return = file_get_contents($url_pantip);
preg_match_all($pattern, $data_return, $get_votes);
echo "get votes = ";
print_r($get_votes);

ผลลัพธ์ค่ะ
get votes =
Array ( [0] => Array ( ) [1] => Array ( ) [2] => Array ( ) [3] => Array ( ) [4] => Array ( ) )

ลองเปลี่ยนไปใช้ (.*) ในระหว่าง tag ลองใช้เครื่องหมาย '(single quote) แทนเครืองหมาย "(double quote) ลองใช้ preg_match() ก็ยังไม่ได้ เลย ค่ะ ขอบคุณค่ะ

Get latest news from Blognone
By: pimnilpat on 23 July 2012 - 16:31 #447789
pimnilpat's picture

หัวข้อที่ต้องการอยู่ในกรอบสีแดงตามรูปค่ะ
http://uppic.i-star.in.th/pantip_vote.xhtml

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 23 July 2012 - 18:12 #447821
UltimaWeapon's picture

ลอง

{syntaxhighlighter brush:html;collapse:true}
T(\d+)<\/font> (.+)<\/a>
{/syntaxhighlighter}

ดูคับ Capturing Group จะเป็น

  1. ID ของกระทู้ (แค่ตัวเลข)
  2. URL ของกระทู้ (Relative)
  3. ชื่อกระทู้

ปล. ทำไมใช้ syntaxhighlighter ไม่ติดหว่า - -a

By: rattananen
AndroidWindows
on 23 July 2012 - 18:26 #447835

/(T\d+)<\/font>.+<a href='(.+)' .+>(.+)<\/a>/

By: pimnilpat on 23 July 2012 - 20:35 #447865
pimnilpat's picture

ขอบคุณ คุณ UltimaWeapon และคุณ rattananen ค่ะ ได้แล้วค่ะ

เพิ่งรู้ว่า มีฟังก์ชั่นนี้ด้วย highlight_string()

แต่ว่า (T\d+) กับ T(\d+) หมายถึงอะไรหรอคะ ^^'

By: rattananen
AndroidWindows
on 23 July 2012 - 20:53 #447872 Reply to:447865
T ก็อักษร T 
\d = [0-9] 
+ ตั้งแต่ 1 ตัวขึ้นไป 

ที่ใช้ (T\d+) เพราะผมจะ capture id กระทู้ครับ

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

By: pimnilpat on 24 July 2012 - 08:42 #447972 Reply to:447872
pimnilpat's picture

^__^ ขอบคุณค่ะ ยากจัง re เนี่ย ~~

By: saknarak
Android
on 23 July 2012 - 22:25 #447886
saknarak's picture

หัวข้อกระทู้น่าจะมีลักษณะแบบนี้

<span class="numkratoo">T12414207</span> <a href="/cafe/mbk/topic/T12414207/T12414207.html" target="_blank" class="linkkratoo">TRUEVISIONS ถ่ายทอดสดไม่จ่อดำFREE TVทั้งพรีเมียร์ลีก-ยูฟ่า-ยูโรป้า ลีก // ปล่อยหมัด ซูเปอร์สปอร์ตส์แพ็ก เพียงเดือนละ650บ [ข่าวโทรคมนาคม]</a> <span class=namekratoo>So magawn</span> <span class=counter>(0 - 23 ก.ค. 55 20:16) </span> pattern ก็ประมาณนี้

$pattern = '#<span class="numkratoo">(.+?)</span> <a href="(.+?)" target="_blank" class="linkkratoo">(.+?)</a> <span class=namekratoo>(.+?)</span> <span class=counter>\((\d+) - (.+?)\) </span>#';

.+ คืออะไร น่าจะพอทราบแล้ว

.+? คือ non greedy หมายถึงให้สั้นที่สุด เท่าที่จะสั้นได้ ไม่ละโมบเอายาวที่สุดเท่าที่จะยาวได้ ยกตัวอย่างเช่น

<span>A</span><span>B</span>

ถ้าเขียน pattern ว่า <span>(.*)</span> แทนที่จะได้ 2 ค่าคือ A และ B กลายเป็นว่าได้ A</span><span>B แทน

จากนั้นก็ใช้ preg_match_all($pattern, $html, $m);

$m เป็น output โดยที่ $m[0] เป็น array ของข้อความทั้งหมด $m[1] เป็น array ของเลขกระทู้ $m[2] เป็น array ของ URL ไล่ไปเรื่อย ๆ ถ้าไม่เข้าใจ

echo '<pre>', print_r($m, true), '</pre>';

ดูผลลัพธ์เอาเอง

edit: อ่านโจทย์ผิด ต้องการกระทู้แนะนำ ดันทำกระทู้ทั้งหมด

By: pimnilpat on 24 July 2012 - 08:54 #447976 Reply to:447886
pimnilpat's picture

^ ^ ขอบคุณค่ะ อยากใช้เก่งๆบ้างจังค่ะ ก็พอดี อ่านเจอมาแล้วก็เอามาผสมกันแบบว่า

. คืออะไรก็ได้ ตัวหนึ่ง
+ คือตั้งแต่ 1 ตัวขึ้นไป
? คือจะมีอยู่หรือไม่ก็ได้ ประมาณนี้ค่ะ 

เห็นว่ามันง่ายดี ไม่ต้องไปคิดมากว่าจะต้องเป้นตัวอะไรหรือภาษาอะไร ก็จะเจอ ประมาณนี้นะคะ ^^'

By: saknarak
Android
on 24 July 2012 - 10:09 #448006 Reply to:447976
saknarak's picture

ความหมายของ ? ขึ้นกับตำแหน่งที่ใช้ด้วยครับ

ถ้า .? แปลว่าอักษรอะไรก็ได้ zero or one

แต่ถ้า .+? จะแปลว่าอักษรอะไรก็ได้ one or more แล้วไม่ greedy
ตามตัวอย่างที่ให้ไว้

<tag>AAA</tag><tag>BBB</tag>

ถ้าทำแบบนี้ <tag>.+</tag> จะได้คำตอบเป็น "AAA</tag><tag>BBB" เพราะอยู่ระหว่าง <tag> กับ </tag>

แต่ถ้าทำแบบนี้ <tag>.+?</tag> จะได้คำตอบแค่ "AAA" เท่านั้น

By: pimnilpat on 24 July 2012 - 18:50 #448198 Reply to:448006
pimnilpat's picture

ขอบคุณค่ะ อธิบายดีจังเลยค่ะ ^__^

By: neizod
ContributorTraineeIn Love
on 24 July 2012 - 20:22 #448227 Reply to:448006
neizod's picture

อิจฉา perl regex จังเลยฮะ ><

By: pimnilpat on 24 July 2012 - 22:57 #448256 Reply to:448227
pimnilpat's picture

อิจฉา perl regex คืออะไรหรอคะ งง ~~

By: neizod
ContributorTraineeIn Love
on 25 July 2012 - 00:34 #448291 Reply to:448256
neizod's picture

perl regex คือ regular expression แบบ perl ครับ (ที่เห็นในหัวฟังก์ชั่นว่า preg นั่นแหละ)

เวลาใช้ match แบบไม่ greedy ตามที่ว่ามา ก็ใช้แค่ <tag>.+?</tag> ได้เลย

ถ้าเป็น regular expression แบบเก่า เวลาจะเขียนไม่ให้ greedy คงต้องทำแบบ <tag>[^<]</tag> แทน (ซึ่งก็ไม่ถูกต้องทั้งหมดอยู่ดี เพราะมันจะพังทันทีถ้าซ้อน <tag> อื่นเข้าไปในนั้นฮะ)

By: pimnilpat on 25 July 2012 - 00:48 #448292 Reply to:448291
pimnilpat's picture

ออ ขอบคุณค่ะ ได้ความรู้เยอะแยะมากมายเลย ^ ^

By: saknarak
Android
on 23 July 2012 - 21:39 #447887
saknarak's picture

ซ้ำขอลบ