Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > PHP > PHP Forum > ต้องการจับบรรทัด <tr> ไปจนถึง </tr> ในบรรทัดนั้น จากการค้นหาจากใน table cell. ทำยังไงครับ?



 

ต้องการจับบรรทัด <tr> ไปจนถึง </tr> ในบรรทัดนั้น จากการค้นหาจากใน table cell. ทำยังไงครับ?

 



Topic : 114269



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์




สมมุติว่าผมมีข้อมูลอย่างนี้

Code
<table> <tbody> <tr style="border:none;"> <td>1</td> <td>[[name_21]]</td> <td>[[charge_2]]</td> </tr> <tr style="border:1px solid #aaa;"> <td>2</td> <td>[[name_13]]</td> <td>[[charge_5]]</td> </tr> <tr style="border:1px solid #ccc;"> <td>3</td> <td>[[name_24]]</td> <td>[[charge_13]]</td> </tr> <tr style="border:1px solid #555;"> <td>4</td> <td>[[name_22]]</td> <td>[[charge_22]]</td> </tr> </tbody> </table>



ผมต้องการแปลงข้อมูล [[charge_5]] และ [[charge_13]]
โดยที่สมมุติว่าถ้า [[charge_5]] ไม่มีค่า ให้ลบทั้ง <tr> ออกไปเลย
และ [[charge_13]] ก็เช่นกัน ถ้าไม่มีค่าให้ลบทั้ง <tr> ออกไปเลย

โค้ดที่ออกแบบไว้คร่าวๆก็ประมาณนี้

Code (PHP)
$html_template = '<table>...</table>';// อันนี้คือตาราง html table ด้านบน

$charge_ids = '';// อันนี้จะน่าจะใช้วิธี preg_match_all ดึงเอาเลขมาจาก [[charge_X]] ทั้งหมด
foreach ($charge_ids as $charge_id) {
    $charge_value = $charge_db->getValue($charge_id);
    if (
        ($charge_id == '5' || $charge_id == '13') 
        && empty($charge_value)
    ) {
        // จะทำการลบ <tr> ทั้งแถวออกไปตรงนี้
    }
}


จะต้องใช้ preg_replace หรือยังไงครับ เพื่อที่จะลบตั้งแต่ <tr ไปจนถึง </tr> ในบรรทัดที่มีเงื่อนไขดังกล่าว?



Tag : PHP







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2015-02-07 18:25:36 By : mr.v View : 1008 Reply : 13
 

 

No. 1



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



สถานะออฟไลน์


ลองดูเป็นตัวอย่างนะครับ
Code (PHP)
<?php
$txt = '   abcd efgh  ijklmno       zzzz';
$rs = preg_replace ('/\s+/', ' ', $txt);
echo '<pre>[',$rs,']</pre>'; exit;
$a=<<<HTML
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<ul>
	<li>TEST1</li>
	<li>TEST2</li>
	<li>TEST3</li>
	<li>TEST4</li>
	<li>TEST5</li>
	<li>TEST6</li>
</ul>
</body>
</html>
HTML;
$m=array();
$tagname='li';
$p="#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#";
preg_match_all( $p, $a, $m);
echo "<pre>", print_r($m, true),"</pre>";

$p="#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#";

?>







แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-07 18:32:33 By : Chaidhanan
 


 

No. 2



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


ยังทำไม่ได้เลยครับ ผมไม่รู้เรื่อง regular expression น่ะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 15:24:33 By : mr.v
 

 

No. 3



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 15:41:14 By : mr.win
 


 

No. 4



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์



แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 15:41:52 By : mr.v
 


 

No. 5



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


อัพเดทโค้ดที่ลองทำ

Code (PHP)
$table = <<< EOD
<table>
    <tbody>
        <tr style="border:none;">
            <td>1</td>
            <td>[[name_21]]</td>
            <td>[[charge_2]]</td>
        </tr>
        <tr style="border:1px solid #aaa;">
            <td>2</td>
            <td>[[name_13]]</td>
            <td>[[charge_5]]</td>
        </tr>
        <tr style="border:1px solid #ccc;">
            <td>3</td>
            <td>[[name_24]]</td>
            <td>[[charge_13]]</td>
        </tr>
        <tr style="border:1px solid #555;">
            <td>4</td>
            <td>[[name_22]]</td>
            <td>[[charge_22]]</td>
        </tr>
    </tbody>
</table>
EOD;


preg_match_all('/\[\[charge_(\d+)\]\]/', $table, $charge_ids);

if (isset($charge_ids)) {
    if (array_key_exists('1', $charge_ids)) {
        $charge_ids = $charge_ids[1];
        $table_replaced = $table;
        foreach ($charge_ids as $charge_id) {
            if ($charge_id == '13') {
                $table_replaced = preg_replace('/<tr[^>]*>(\[\[charge_'.$charge_id.'\]\])<\/tr>/iUums', 'a', $table_replaced);
            }
        }

        echo $table_replaced;
    }
}



ผลลัพธ์ยังไม่ได้ลบบรรทัดที่มี charge_id = 13 ออกเลย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 16:05:44 By : mr.v
 


 

No. 6



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



สถานะออฟไลน์


ถ้าบอกว่าไม่รู้เรื่อง regular expression เลย แล้วจะให้เขียนให้หรืออยา่งไรครับ
ไปลองอ่านมาก่อนดีกว่าไหมครับ

ทดลองทำกับคำสั่งง่ายๆ
ผมขึ้นให้เป็นตัวอย่างง่ายๆ เอาเป็น table ตามตัวอย่างเลย ส่วนหาค่า มาแทนตัวแปร ลองเขียนเองดูเอานะครับ
Code (PHP)
$html=<<<HTML
<table>
<tbody>
<tr style="border:none;">
	<td>1</td>
	<td>[[name_21]]</td>
	<td>[[charge_2]]</td>
</tr>
<tr style="border:1px solid #aaa;">
	<td>2</td>
	<td>[[name_13]]</td>
	<td>[[charge_5]]</td>
</tr>
<tr style="border:1px solid #ccc;">
	<td>3</td>
	<td>[[name_24]]</td>
	<td>[[charge_13]]</td>
</tr>
<tr style="border:1px solid #555;">
	<td>4</td>
	<td>[[name_22]]</td>
	<td>[[charge_22]]</td>
</tr>
</tbody>
</table>
HTML;
/////////////////////////////////////////////////////
$m=array();
$tagname='tr';
$p='#<'.$tagname.'[^>]*>(.*?)</'.$tagname.'>#s';
preg_match_all( $p, $html, $m);
foreach( $m[0] as $tr){
	echo htmlspecialchars($tr), "<br>";
	$p13="ลองใส่ regular ดูนะครับ";
	$p5="ลองใส่ regular ดูนะครับ";
	if( preg_match( array($p5, $p13), $tr)){
		//ถ้าเจอทำอะไร
	}else{
		//ถ้าไม่เจอทำอะไร
	}
}




ประวัติการแก้ไข
2015-02-09 19:40:35
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 19:39:43 By : Chaidhanan
 


 

No. 7



โพสกระทู้ ( 3,468 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter

ผมไม่ค่อยเข้าใจ คำถาม

คือ ต้องการลบ ทั้งแถว <tr> เลย ใช่ไหม หากพบ

ประมาณนี้ป่าว ประมาณว่ามีค่าที่จะเอาออกแล้ว
$removes = [5, 13] ;
หรือ มีค่าที่คงไว้
$excerpt = [2, 22];


หรือต้องหาค่าอะไรก่อนป่าว
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 20:42:55 By : pjgunner.com
 


 

No. 8



โพสกระทู้ ( 455 )
บทความ ( 0 )



สถานะออฟไลน์


เอาไปลอง run ดูนะ สังเกตุ tr ที่มี td เป็น 0 จะหายไป ไม่รู้ใช่อย่างที่ต้องการเปล่านะ

Code (PHP)
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<meta charset="utf-8">
</head>

<body>
<table border="1">
	<tr>
		<td>1</td>
		<td>name</td>
	</tr>
	<tr>
		<td>13</td>
		<td>name</td>
	</tr>
	<tr>
		<td>0</td>
		<td>name</td>
	</tr>
	<tr>
		<td>11</td>
		<td>name</td>
	</tr>
	<tr>
		<td>5</td>
		<td>name</td>
	</tr>
	<tr>
		<td>2</td>
		<td>name</td>
	</tr>
	<tr>
		<td>0</td>
		<td>name</td>
	</tr>
	<tr>
		<td>50</td>
		<td>name</td>
	</tr>
	<tr>
		<td>13</td>
		<td>name</td>
	</tr>
	<tr>
		<td>20</td>
		<td>name</td>
	</tr>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
	$(function(){
		$("table tr").each(function(){
			if($(this).find("td:nth-child(1)").text() == '0'){
				$(this).remove();
			}else{
				return;
			}
		})
	})
</script>
</body>
</html>

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 21:41:08 By : yamcrocodile
 


 

No. 9



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 7 เขียนโดย : pjgunner.com เมื่อวันที่ 2015-02-09 20:42:55
รายละเอียดของการตอบ ::
คุณเอี่ยวครับ คือเอาทั้งบรรทัดของตารางออกเลยอะครับ <tr.....ไปยัน </tr> ในบรรทัดที่มีค่าดังกล่าวอยู่ใน table cell
กล่าวคือ <tr style="border:1px solid #aaa;">
<td>2</td>
<td>[[name_13]]</td>
<td>[[charge_5]]</td>
</tr>

และ

<tr style="border:1px solid #ccc;">
<td>3</td>
<td>[[name_24]]</td>
<td>[[charge_13]]</td>
</tr>
ถ้าหากใน 2 บรรทัดนี้ ค่า charge_ แปลงแล้วไม่มีค่า สมมุติว่า charge_5 แปลงแล้วไม่มีค่าให้เอาออกเลยแบบนั้นน่ะครับ



update: ตอนนี้ผมทำได้แล้วโดยใช้ DOMDocument มาทำงานแทนเพราะใช้ preg_replace แล้วหาจุดสิ้นสุดเฉพาะ table row <tr> นั้นๆไม่เจอ ถ้าเจอก็จะกลายเป็นลบเอา <tr> ของบรรทัดอื่นๆไปด้วยครับ

Code (PHP)
$dom = new \DOMDocument();
$dom->loadHTML($table);
$xpath = new \DOMXPath($dom);

// loop all <tr> element.
foreach ($xpath->query('//tr') as $tr) {
    $tds = $tr->getElementsByTagName('td');
    // get total <td> in this <tr>
    $total_item = $tds->length;

    // loop to all <td> and check.
    for ($i = 0; $i <= ($total_item-1); $i++) {
        // get table cell value.
        $table_cell_value = $tds->item($i)->nodeValue;
        preg_match('/\[\[charge_(\d+)\]\]/', $table_cell_value, $charge_id);

        // check if condition is met, the charge_id is 13.
        if (is_array($charge_id) && array_key_exists(1, $charge_id) && $charge_id[1] == 13) {
            // condition met. charge_id is 13. remove this table row.
            $tr->parentNode->removeChild($tr);
        }
        unset($charge_id, $table_cell_value);
    }

    unset($tds, $total_item);
}

// get the result
$saved_html = preg_replace('~<(?:!DOCTYPE|/?(?:html|body))[^>]*>\s*~i', '', $dom->saveHTML());
echo $saved_html;


จากโค้ดตัวอย่างที่ผมใช้ จะเอาเฉพาะค่า charge_id = 13 ถ้าเจอแล้วลบออกเลย โดยสมมุติว่า charge_id 13 แปลงแล้วไม่มีค่าอะไร
ดังนั้นจึงได้ตารางที่แปลงแล้วดังนี้
Code
<table><tbody><tr style="border:none;"><td>1</td>
<td>[[name_21]]</td>
<td>[[charge_2]]</td>
</tr><tr style="border:1px solid #aaa;"><td>2</td>
<td>[[name_13]]</td>
<td>[[charge_5]]</td>
</tr><tr style="border:1px solid #555;"><td>4</td>
<td>[[name_22]]</td>
<td>[[charge_22]]</td>
</tr></tbody></table>



ประวัติการแก้ไข
2015-02-09 22:25:55
2015-02-11 01:46:02
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 22:22:17 By : mr.v
 


 

No. 10



โพสกระทู้ ( 3,468 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter

งั้น ลองเอาโค้ดผมไปใช้ดู

Code (PHP)
$table = <<< EOD
<table>
    <tbody>
        <tr style="border:none;">
            <td>1</td>
            <td>[[name_21]]</td>
            <td>[[charge_2]]</td>
        </tr>
        <tr style="border:1px solid #aaa;">
            <td>2</td>
            <td>[[name_13]]</td>
            <td>[[charge_5]]</td>
        </tr>
        <tr style="border:1px solid #ccc;">
            <td>3</td>
            <td>[[name_24]]</td>
            <td>[[charge_13]]</td>
        </tr>
        <tr style="border:1px solid #555;">
            <td>4</td>
            <td>[[name_22]]</td>
            <td>[[charge_22]]</td>
        </tr>
    </tbody>
</table>
EOD;

$exclude = [5, 13]; // ที่ไม่เอา
$pattern = '/<tr.*charge_(\d++).*tr>/Us';

$result = preg_replace_callback($pattern, function($found) use ($exclude){
    if ( !in_array($found[1], $exclude))
        return $found[0];
    return '';
}, $table);

echo $result;


requst response
<table>
    <tbody>
        <tr style="border:none;">
            <td>1</td>
            <td>[[name_21]]</td>
            <td>[[charge_2]]</td>
        </tr>
        
        
        <tr style="border:1px solid #555;">
            <td>4</td>
            <td>[[name_22]]</td>
            <td>[[charge_22]]</td>
        </tr>
    </tbody>
</table>

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 22:26:45 By : pjgunner.com
 


 

No. 11



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 10 เขียนโดย : pjgunner.com เมื่อวันที่ 2015-02-09 22:26:45
รายละเอียดของการตอบ ::
ขอบคุณอีกครั้งครับ แจ่มไปเลยได้ผลและโค้ดสั้นกว่าของผมด้วย

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 22:33:35 By : mr.v
 


 

No. 12



โพสกระทู้ ( 3,468 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter

คือนานๆ ผมเข้ามาที ก็เพิ่งเห็นกระทู้

Quote:
แล้วหาจุดสิ้นสุดเฉพาะ table row <tr> นั้นๆไม่เจอ ถ้าเจอก็จะกลายเป็นลบเอา <tr> ของบรรทัดอื่นๆไปด้วยครับ


มันต้องใช้ความเข้าใจขั้นสูงนิดนึง เพราะมันดันเอามาหมด หรือไม่ก็เอามาน้อยเกิน


ประวัติการแก้ไข
2015-02-09 22:35:29
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-09 22:34:03 By : pjgunner.com
 


 

No. 13



โพสกระทู้ ( 3,468 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter

อัพเดทนิดนึง พอเห็นมันมีบรรทัดว่างใน response

จาก
$pattern = '/<tr.*charge_(\d++).*tr>/Us';


เป็น
$pattern = '/<tr.*charge_(\d++).*tr>\s++/Us';



Response text
<table>
    <tbody>
        <tr style="border:none;">
            <td>1</td>
            <td>[[name_21]]</td>
            <td>[[charge_2]]</td>
        </tr>
        <tr style="border:1px solid #555;">
            <td>4</td>
            <td>[[name_22]]</td>
            <td>[[charge_22]]</td>
        </tr>
    </tbody>
</table>



ประวัติการแก้ไข
2015-02-10 21:09:42
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-02-10 21:09:08 By : pjgunner.com
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ต้องการจับบรรทัด <tr> ไปจนถึง </tr> ในบรรทัดนั้น จากการค้นหาจากใน table cell. ทำยังไงครับ?
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่