ต้องการตัดหัวข้อ ที่เป็นกระทู้แนะนำ ในหน้านี้ค่ะ 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() ก็ยังไม่ได้ เลย ค่ะ ขอบคุณค่ะ
หัวข้อที่ต้องการอยู่ในกรอบสีแดงตามรูปค่ะ
http://uppic.i-star.in.th/pantip_vote.xhtml
ลอง
{syntaxhighlighter brush:html;collapse:true}
T(\d+)<\/font> (.+)<\/a>
{/syntaxhighlighter}
ดูคับ Capturing Group จะเป็น
ปล. ทำไมใช้ syntaxhighlighter ไม่ติดหว่า - -a
/(T\d+)<\/font>.+<a href='(.+)' .+>(.+)<\/a>/
ขอบคุณ คุณ UltimaWeapon และคุณ rattananen ค่ะ ได้แล้วค่ะ
เพิ่งรู้ว่า มีฟังก์ชั่นนี้ด้วย highlight_string()
แต่ว่า (T\d+) กับ T(\d+) หมายถึงอะไรหรอคะ ^^'
ที่ใช้ (T\d+) เพราะผมจะ capture id กระทู้ครับ
http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
^__^ ขอบคุณค่ะ ยากจัง re เนี่ย ~~
หัวข้อกระทู้น่าจะมีลักษณะแบบนี้
<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: อ่านโจทย์ผิด ต้องการกระทู้แนะนำ ดันทำกระทู้ทั้งหมด
^ ^ ขอบคุณค่ะ อยากใช้เก่งๆบ้างจังค่ะ ก็พอดี อ่านเจอมาแล้วก็เอามาผสมกันแบบว่า
เห็นว่ามันง่ายดี ไม่ต้องไปคิดมากว่าจะต้องเป้นตัวอะไรหรือภาษาอะไร ก็จะเจอ ประมาณนี้นะคะ ^^'
ความหมายของ ? ขึ้นกับตำแหน่งที่ใช้ด้วยครับ
ถ้า .? แปลว่าอักษรอะไรก็ได้ zero or one
แต่ถ้า .+? จะแปลว่าอักษรอะไรก็ได้ one or more แล้วไม่ greedy
ตามตัวอย่างที่ให้ไว้
<tag>AAA</tag><tag>BBB</tag>
ถ้าทำแบบนี้ <tag>.+</tag> จะได้คำตอบเป็น "AAA</tag><tag>BBB" เพราะอยู่ระหว่าง <tag> กับ </tag>
แต่ถ้าทำแบบนี้ <tag>.+?</tag> จะได้คำตอบแค่ "AAA" เท่านั้น
ขอบคุณค่ะ อธิบายดีจังเลยค่ะ ^__^
อิจฉา perl regex จังเลยฮะ ><
อิจฉา perl regex คืออะไรหรอคะ งง ~~
perl regex คือ regular expression แบบ perl ครับ (ที่เห็นในหัวฟังก์ชั่นว่า preg นั่นแหละ)
เวลาใช้ match แบบไม่ greedy ตามที่ว่ามา ก็ใช้แค่
<tag>.+?</tag>
ได้เลยถ้าเป็น regular expression แบบเก่า เวลาจะเขียนไม่ให้ greedy คงต้องทำแบบ
<tag>[^<]</tag>
แทน (ซึ่งก็ไม่ถูกต้องทั้งหมดอยู่ดี เพราะมันจะพังทันทีถ้าซ้อน<tag>
อื่นเข้าไปในนั้นฮะ)ออ ขอบคุณค่ะ ได้ความรู้เยอะแยะมากมายเลย ^ ^
ซ้ำขอลบ