ต้องการจับบรรทัด <tr> ไปจนถึง </tr> ในบรรทัดนั้น จากการค้นหาจากใน table cell. ทำยังไงครับ?
ลองดูเป็นตัวอย่างนะครับ
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
ยังทำไม่ได้เลยครับ ผมไม่รู้เรื่อง regular expression น่ะครับ
Date :
2015-02-09 15:24:33
By :
mr.v
Date :
2015-02-09 15:41:14
By :
mr.win
Date :
2015-02-09 15:41:52
By :
mr.v
อัพเดทโค้ดที่ลองทำ
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
ถ้าบอกว่าไม่รู้เรื่อง 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
ผมไม่ค่อยเข้าใจ คำถาม
คือ ต้องการลบ ทั้งแถว <tr> เลย ใช่ไหม หากพบ
ประมาณนี้ป่าว ประมาณว่ามีค่าที่จะเอาออกแล้ว
$removes = [5, 13] ;
หรือ มีค่าที่คงไว้
$excerpt = [2, 22];
หรือต้องหาค่าอะไรก่อนป่าว
Date :
2015-02-09 20:42:55
By :
pjgunner.com
เอาไปลอง 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
ตอบความคิดเห็นที่ : 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
งั้น ลองเอาโค้ดผมไปใช้ดู
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
อัพเดทนิดนึง พอเห็นมันมีบรรทัดว่างใน 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
Load balance : Server 03