จะแทนค่ายังไงดีครับเนี่ย (regular) <td class="..."><div="..">...</div></td> งง

เริ่มโดย okgofun, 14 กรกฎาคม 2007, 14:26:30

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

okgofun

จะแทนค่ายังไงดีครับเนี่ย (regular) <td class="..."><div="..">...</div></td> งง

ลองทั้ง preg_match , eregi_replace แต่มันไม่ผ่านอะครับ

ประมาณว่า ข้อมูลที่เราจะแทนค่า ถ้ามันเป็นพวก html พวกโครงสร้างตารางต่างๆ ซึ่งมันไม่ได้มีแต่ตัวหนังสือหนะครับ เหมือนว่ามันตรวจสอบไม่ได้อะ

ตรง <td class="abc"> นี่ได้ พอมาถึงตรง <div มันคงมีปัญหา ผมเขียนโค๊ดประมาณนี้

if(!preg_match('/^<td class="abc">(.*?)<\/td>$/',$data) {
    // code
}

คือมันไม่ผ่านครับ ทั้งที่โครงสร้างที่ผมกำหนดทดสอบเอาไว้ก็ตรงตามที่กำหนด

ใครทราบขอคำแนะนำด้วยครับ พยายามหาทางแล้วอะ แต่ไม่ได้จริงๆครับ
จะต้องทำให้ได้เดือนละอย่างต่ำ $1,000 แล้วก็ไม่โดนแบน

kengz

อ่านคำถามไม่เข้าใจครับ
ช่วยยกตัวอย่าง ข้อมูลที่มีอยู่และข้อมูลที่ต้องการ ให้หน่อยครัยบ
เดี๋ยวช่วยบอกให้

Pipo

<?
$strString   =   '<td class="abc"><div="..">...</div></td>';

if(!preg_match('/^<td class="abc">(.*?)<\/td>$/',$strString)) {
    echo "OMG";
}
?>

งงกับคำถามแต่คิดว่าน่าจะใช่คำตอบ

เข้าใจตรง ^ กับ $ ใช่ไหมครับ

Judas

ลองยกตัวอย่างข้อมูลที่มีอยู่ กับข้อมูลที่อยากให้เป็นมาจิครับ
[direct=http://richparadise.net]Forex Paradise[/direct]
[direct=http://richparadise.net]ฟอเร็กซ์ พาราไดส์[/direct]
[direct=http://forexparadisethailand.blogspot.com/]Forex Paradise[/direct]
[direct=http://richparadise.net]Forex Paradise Thailand[/direct]
[direct=https://www.facebook.com/groups/965285316880180/]FB Group พูดคุยเกี่ยวกับ ForexParadise.biz[/direct]

okgofun

ลอง
อ้างถึงจาก: Pipo ใน 14 กรกฎาคม 2007, 15:45:52
<?
$strString   =   '<td class="abc"><div="..">...</div></td>';

if(!preg_match('/^<td class="abc">(.*?)<\/td>$/',$strString)) {
    echo "OMG";
}
?>

งงกับคำถามแต่คิดว่าน่าจะใช่คำตอบ

เข้าใจตรง ^ กับ $ ใช่ไหมครับ

ถูกต้องแล้วครับ ประมาณนั้น แต่ผมลองแล้วคือมันไม่ได้ผลครับ ยังไม่เข้าใจ (.*?) จริงๆแล้วมันหมายถึงยังไงแน่ครับ หมายถึงกลุ่มคำใดๆในวงเล็บเหรอครับ ที่ผมเห็นยังมี (.+?) อีก (ส่วน ^,$ ที่เป็นขึ้นต้นหรือลงท้ายพอจะเข้าใจครับ)

หลักๆที่ผมต้องการคือว่า ผมดึงข้อมูลจากเว็บเพจๆหนึ่ง ซึ่งจะมี tag html ในส่วนของ table เช่น ผมต้องการตรวจสอบ ข้อมูลตาม tag ที่ดึงมานี่คือ

<td class="mystyle">
   <div id="wow">Hello This is my site <b>Good site</b> <a href="http://www.goodsitetest.com" target="_blank">Click Now</a>
   <br><br>New Line
<div id="style2">Ha Ha Ha</div>
</div>
</td>

ต้องการตรวจสอบว่า ถ้าขึ้นต้นด้วย <td class="mystyle">.. ข้อมูลใดๆก็ได้ที่อยู่ระหว่าง tag นี้ซึ่งอาจเป็น code html ตามตัวอย่างขั้นต้น ที่อาจจะมีการอัพเดทเปลี่ยนแปลงได้ ไม่ตายตัว และอาจจมีสัญลักษณ์ ",' หรือ tag ต่างๆที่อาจทำให้ regular expression ไม่ทำงาน</td>

กึ่งกลางของ <td class="mystyle"> และ </td> ผมต้องการตรวจสอบครับ ว่าเป็นลักษณะนี้ใหม ถ้าเป็นลักษณะนี้ ผมอาจจะ replace ให้เป็นไสตล์ของผม หรืออาจจะให้ค่าเป็น FALSE

การเขียนโค๊ดหลักจากนั้นพอจะเข้าใจครับ

แต่ *** ปัญหามันอยู่ที่ ระหว่างกึ่งกลาง <td class="mystyle"></td> นี่สิครับ มันจะมีการเปลี่ยนแปลงบ่อยๆ ผมจะเขียน regular expression ยังไงดี เพราะรู้สึกว่าถ้ามันมีเครื่องหมายบางอย่าง จะทำให้การทำงานของ regular  expression มันไม่ถูกต้องในการตรวจสอบครับ

แต่ถ้าเบื้องต้นง่ายๆบางอักขระเช่น

$strString = "http://www.abc.com" ;
if(preg_match('/^<a href="abc">(.*?)<\/a>$/',$strString)) {
    echo "URL";
}

แบบนี้หนะได้ครับ

แต่.. ถ้ามันมีโค๊ด html หรืออักขระที่ซับซ็อนกว่านี้มันจะ มีปัญหา

ไม่รู้ว่าจะเขียนยังไงดี ครับ ขอบคุณครับ
จะต้องทำให้ได้เดือนละอย่างต่ำ $1,000 แล้วก็ไม่โดนแบน

Tee++;

บอกตามตรงยังไม่ได้อ่านกระทู้ละเอียดๆ หรอก ไม่ค่อย บายนะ แต่ท่าให้เดาว่าพลาดตรงไหนคิดว่า ลองเติมนี่ลงไปครับ

$html = ereg_replace("\n|\r", "", $html);

จากนั้นค่อยเอา $html ไปทำงานต่อ
[direct=http://laravel.in.th]Laravel in Thai[/direct]
[direct=http://jquerytips.com]jQueryTips by Tee++;[/direct]
[direct=https://www.facebook.com/jQueryTips]jQueryTips Page[/direct]
[direct=https://www.facebook.com/Laravel.in.th]Laravel in Thai Page[/direct]
[direct=https://twitter.com/Teepluss]Teepluss's Twitter[/direct]


kengz

ไม่สามารถใช้ regular expression เพียงอย่างเดียวตรวจสอบได้ครับ
สิ่งที่คุณต้องการเขียนจะออกแนว parser ซะมากกว่า

ปัญหาแรกของคุณคือ ใน regular expression ไม่ค่อยใช้งานได้กับตัวเว้นบรรทัด (\r\n และ \n) ครับ ดังนั้น step แรกที่คุณต้องการคืออาจจะตัดมันออกไปก่อน อย่างที่พี่ตี๋ได้แนะนำไว้

หากคุณต้องการ grab ข้อความที่อยุ่ระหว่าง <td class="abc"> และ </td>
ตามความจริงแล้ว คุณอาจจะใช้ preg_match("/<td class=\"abc\">(.*)<\/td>/",$string,$matches); ก็ได้ครับ แต่อาจจะผิดพลาดอยู่
เช่น

<td class="abc">xxx</td><td class="xyz">xxx</td>

สังเกตุว่า ในข้อความสีแดง ก็จะ match regex ที่คุณเขียนไปเหมือนกัน แต่ว่าไม่ใช่ข้อมูลจริง ๆ
ดังนั้นคุณควรใช้วิธีอื่นมาอ่านข้อมุลจะดีกว่าครับ จะทำงานได้แม่นยำกว่า

เช่น
แยก 1 tag เป็น array 1 ช่อง

<table>
<tr>
<td>
<a href="xxx">
ssss
</a>
</td>
</tr>
</table>

แล้วค่อย ๆ ไล่ไปทีละ ตัว ใช้ regular expression match ว่าเริ่ม <td class="aaa"> มั้ย
จากนนั้นก็ grab มาเรื่อย ๆ จนถึง </td> ตัวแรก.. อะไรทำนองนี้อ่ะครับ น่าจะทำงานได้แม่นยำกว่า


ปล. .*? ไม่มีนะครับ มีแค่ .* หรือ .? เพราะ * กับ ? เป็นตัวบ่งบอกปริมาณ
? = 0 ถึง 1
* = 0 ถึง unlimit

okgofun

อ่า ทำได้แล้วครับ ขอบคุณทุกท่านครับ หลักๆนี่คือถ้าตัด /r/n/t ออกก็โอเคแล้ว ที่เหลือก็อย่างที่คุณ kengz บอกจริงๆครับ คือต้องเขียนโค๊ดกรองเอาเองอีกชั้น ต้องรู้ regular express แบบเยอะๆเลย

ผมลองโหลด regex buddy มา ค่อนข้างมีประโยชน์ แต่ก็งงตึ๊บ  :D
จะต้องทำให้ได้เดือนละอย่างต่ำ $1,000 แล้วก็ไม่โดนแบน