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 > preg_match_all() ค้าง - รบกวนตรวจสอบโค้ดชุดนี้ และแนะนำวิธีแก้ไขให้หน่อยครับ



 

preg_match_all() ค้าง - รบกวนตรวจสอบโค้ดชุดนี้ และแนะนำวิธีแก้ไขให้หน่อยครับ

 



Topic : 132120



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



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



คำสั่งด้านล่างนี้ ผมรันบน https://phpfiddle.org/
ก็สามารถทำงานได้ แต่พอเอามารันบน Localhost กลับค้างซะอย่างนั้น

ตอนนี้รู้แล้วว่าเป็นเพราะ $pattern แต่ไม่รู้จะแก้อย่างไรครับ

$pattern = "/<(".$tag.")[^>]*".$attr."\s*=\s*"."(['\"])$value\\2[^>]*>((.|\s)+?)<\/\\1>/";


ถ้าเปลี่ยนตรงนี้ ((.|\s)+?) เป็น (.*?) ก็จะไม่ error แต่ก็ไม่ได้ข้อมูลใดๆออกมาครับ

Code (PHP)
<?php
<?php

function getTextBetweenTags($string, $tagname) {
    $tag = '\w+';
    $attr = 'parser-repeat';
    
    $attr = preg_quote($attr);
	$value = preg_quote($tagname);
    
    $pattern = "/<(".$tag.")[^>]*".$attr."\s*=\s*".
					"(['\"])$value\\2[^>]*>((.|\s)+?)<\/\\1>/";
    preg_match_all($pattern, $string, $matches);
	
    return $matches;
}

$str = '<style>
.table th.fit,
.table td.fit {
	white-space: nowrap;
	width: 2%;
}
</style>
<div class="card">

	<div class="card-header bg-primary">
		<h3 class="card-title"><i class="fa fa-clipboard"></i> รายละเอียด <b>Reward</b></h3>
	</div>
	
	<div class="card-body">
		<table class="table table-bordered table-hover">
			<thead class="well">
				<tr>
					<th class="text-right fit">หัวข้อ</th>
					<th>ข้อมูล</th>
				</tr>
			</thead>
			<tbody parser-repeat="master_data">
				
				<tr>
					<td class="text-right fit"><b>Id :</b></td>
					<td>{id}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>รหัสลูกค้า :</b></td>
					<td>{member_code}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>แต้มสะสม :</b></td>
					<td>{reward_point}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>1=ครบ (10 แต้ม แลก 1 แก้ว) :</b></td>
					<td>{redemption}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Create Datetime :</b></td>
					<td>{create_datetime}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Create User Id :</b></td>
					<td>{create_user_id}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Modify Datetime :</b></td>
					<td>{modify_datetime}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Modify User Id :</b></td>
					<td>{modify_user_id}</td>
				</tr>
			</tbody>
		</table>
	</div>
</div>';

$txt = getTextBetweenTags($str, "master_data");
echo '<pre>', htmlentities(print_r($txt,true)),'</pre>';

?>

?>



ปล. 1 แก้ไขให้โค้ดส่งพารามิเตอร์เข้าไปในฟังก์ชั่นให้ตรงกับการรับค่า



Tag : PHP









ประวัติการแก้ไข
2018-09-22 22:03:20
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2018-09-22 15:33:09 By : {Cyberman} View : 1046 Reply : 7
 

 

No. 1



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



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


html ไม่เหมาะกับ regular expression ครับ https://stackoverflow.com/a/1732454/128761

Code (PHP)
<?php

$str = '
<style>
.table th.fit,
.table td.fit {
	white-space: nowrap;
	width: 2%;
}
</style>
<div class="card">

	<div class="card-header bg-primary">
		<h3 class="card-title"><i class="fa fa-clipboard"></i> รายละเอียด <b>Reward</b></h3>
	</div>
	
	<div class="card-body">
		<table class="table table-bordered table-hover">
			<thead class="well">
				<tr>
					<th class="text-right fit">หัวข้อ</th>
					<th>ข้อมูล</th>
				</tr>
			</thead>
			<tbody parser-repeat="master_data">
				
				<tr>
					<td class="text-right fit"><b>Id :</b></td>
					<td>{id}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>รหัสลูกค้า :</b></td>
					<td>{member_code}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>แต้มสะสม :</b></td>
					<td>{reward_point}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>1=ครบ (10 แต้ม แลก 1 แก้ว) :</b></td>
					<td>{redemption}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Create Datetime :</b></td>
					<td>{create_datetime}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Create User Id :</b></td>
					<td>{create_user_id}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Modify Datetime :</b></td>
					<td>{modify_datetime}</td>
				</tr>
				<tr>
					<td class="text-right fit"><b>Modify User Id :</b></td>
					<td>{modify_user_id}</td>
				</tr>
			</tbody>
		</table>
	</div>
</div>';


echo '<h3>original</h3>'.PHP_EOL;
echo '<pre>'.htmlspecialchars(print_r($str, true)).'</pre>'.PHP_EOL;
echo '<hr>'.PHP_EOL;


$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $str, LIBXML_HTML_NODEFDTD);

$table = $dom->getElementsByTagName('table')->item(0);
if (is_object($table)) {
	$tbody = $table->getElementsByTagName('tbody')->item(0);
	if ($tbody->hasAttribute('parser-repeat') && $tbody->getAttribute('parser-repeat') === 'master_data') {
		foreach ($table->getElementsByTagName('tr') as $tr) {
			if (is_object($tr)) {
				foreach ($tr->getElementsByTagName('td') as $td) {
					echo $td->nodeValue;
					echo '<br>'.PHP_EOL;
				}
			} else {
				throw new \Exception('Invalid html content (tr).');
			}
			echo '<!--end tr--><br>'.PHP_EOL;
		}
	} else {
		throw new \Exception('Invalid html content (tbody contain no attribute or wrong value for this attribute.).');
	}
	unset($tbody);
} else {
	throw new \Exception('Invalid html content (table).');
}
unset($table);


คงเอาไปประยุกต์ใช้เองได้นะครับ ผลมันออกมาเรียงให้แล้วล่ะ.








ประวัติการแก้ไข
2018-09-22 16:36:50
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2018-09-22 16:30:41 By : mr.v
 


 

No. 2



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



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

ขอบคุณสำหรับตัวอย่างโค้ดครับ

แต่เนื่องจากรูปแบบที่ต้องการคืออาร์เรย์ที่มีข้อมูลดังในภาพนี้ ก็เลยต้องใช้ preg_match ครับ

รูปแบบที่ต้องการ

กับ HTML อีกชุด ก็ทำงานได้ปกติ

Code (PHP)
<?php

function getTextBetweenTags($string, $tagname) {
    $tag = '\w+';
    $attr = 'parser-repeat';
    
    $attr = preg_quote($attr);
	$value = preg_quote($tagname);
    
    $pattern = "/<(".$tag.")[^>]*".$attr."\s*=\s*".
					"(['\"])$value\\2[^>]*>((.|\s)+?)<\/\\1>/";
    preg_match_all($pattern, $string, $matches);
	
    return $matches;
}

$str = '<html>
	<head>
		<title>การแสดงผลแบบใช้ Parser Repeat</title>
		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
		<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
	</head>
    <body>
        <h3>{blog_heading}</h3>
		<ul>
			<li parser-repeat="data_list">{title}</li>
		</ul>
		<H1>One</h1>
		<table class="table table-bordered" border="1" style="width:500px">
			<thead>
				<tr bgcolor="#aaaaaa">
					<td>Title</td>
					<td>body</td>
				</tr>
			</thead>
			<tbody>
				<tr parser-repeat="blog_entries">
					<td>{title}</td>
					<td>{body}</td>
				</tr>
			</table>
		</table>
		<H1>Two</h1>
		<table class="table table-bordered" border="1" style="width:500px">
			<thead>
				<tr bgcolor="#aaaaaa">
					<td>Title 2</td>
					<td>body 2</td>
					<td>Link 2</td>
				</tr>
			</thead>
			<tbody parser-repeat="master_data">
				<tr>
					<td>{title}</td>
					<td>{body}</td>
					<td>{{link}}</td>
				</tr>
			</tbody>
		</table>
    </body>
</html>';



$txt = getTextBetweenTags($str, 'master_data');
echo '<pre>', htmlentities(print_r($txt,true)),'</pre>';


?>


ตอนนี้ก็เลยงง ว่าเกิดจากอะไรทำไมถึงรันกับ HTML ชุดแรกแล้วค้างไปเลยครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2018-09-22 22:06:29 By : {Cyberman}
 

 

No. 3



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



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


ปิดเออเร่อร์ไว้หรือเปล่า ดูใน log php-error เพื่อจะรู้ว่าอะไรเป็นอะไร
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2018-09-22 22:34:42 By : Chaidhanan
 


 

No. 4



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



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


Code (PHP)
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $str, LIBXML_HTML_NODEFDTD);

$table = $dom->getElementsByTagName('table')->item(0);
if (is_object($table)) {
	$tbody = $table->getElementsByTagName('tbody')->item(0);
	if ($tbody->hasAttribute('parser-repeat') && $tbody->getAttribute('parser-repeat') === 'master_data') {
		$innerHTML = $tbody->ownerDocument->saveHTML($tbody);
		echo '<pre>'.htmlspecialchars(print_r($innerHTML, true)).'</pre>'.PHP_EOL;
	} else {
		throw new \Exception('Invalid html content (tbody contain no attribute or wrong value for this attribute.).');
	}
	unset($tbody);
} else {
	throw new \Exception('Invalid html content (table).');
}
unset($table);


ถ้าจะเอาเนื้อหา html อย่างที่ว่าก็ใช้ saveHTML() มันก็ใช้งานได้

ผลลัพธ์:

Code
<tbody parser-repeat="master_data">

<tr>
<td class="text-right fit"><b>Id :</b></td>
<td>{id}</td>
</tr>
<tr>
<td class="text-right fit"><b>รหัสลูกค้า :</b></td>
<td>{member_code}</td>
</tr>
<tr>
<td class="text-right fit"><b>แต้มสะสม :</b></td>
<td>{reward_point}</td>
</tr>
<tr>
<td class="text-right fit"><b>1=ครบ (10 แต้ม แลก 1 แก้ว) :</b></td>
<td>{redemption}</td>
</tr>
<tr>
<td class="text-right fit"><b>Create Datetime :</b></td>
<td>{create_datetime}</td>
</tr>
<tr>
<td class="text-right fit"><b>Create User Id :</b></td>
<td>{create_user_id}</td>
</tr>
<tr>
<td class="text-right fit"><b>Modify Datetime :</b></td>
<td>{modify_datetime}</td>
</tr>
<tr>
<td class="text-right fit"><b>Modify User Id :</b></td>
<td>{modify_user_id}</td>
</tr>
</tbody>


อ้างอิง:
http://php.net/manual/en/class.domdocument.php
http://php.net/manual/en/class.domnode.php

ส่วนที่จะต้องเป็น array รูปแบบนั้นมันก็ไม่ได้ยากอะไรหรอกถ้าเข้าใจวิธีสร้าง array.
ถ้าวิธีไหนมันทำไม่ได้แต่อีกวิธีมันทำได้และเขาแนะนำกันก็ดัดแปลงเอาหน่อยสิครับ มันไม่ยากเกินไปหรอก.


ประวัติการแก้ไข
2018-09-23 11:44:18
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2018-09-23 11:42:10 By : mr.v
 


 

No. 5



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



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


Code (PHP)
/**
 * print out string as html encoded using `htmlspecialchars()` function.
 */
function printDebug($string)
{
	echo '<pre>' . htmlspecialchars(print_r($string, true), ENT_QUOTES) . '</pre>' . PHP_EOL;
}


echo '<h3>original</h3>' . PHP_EOL;
printDebug($str);
echo '<hr>' . PHP_EOL;


/**
 * Get inner content of HTML table.
 * 
 * @param string $string
 * @param string $getElementName The HTML element name to get.
 * @param string|false $requiredAttribute Set to false for not validate, set the attribute name to validate.
 * @param string|false $requiredAttributeValue Set to false for not validate, set the attribute value to validate.
 * @return string
 * @throw exception on failed to validate or get HTML.
 */
function getHTMLTableInnerContent($string, $getElementName = 'tbody', $requiredAttribute = false, $requiredAttributeValue = false)
{
	$dom = new DOMDocument();
	$dom->preserveWhiteSpace = false;
	$dom->formatOutput = false;
	// '<?xml encoding="utf-8" ?\>' คือเพื่อให้มันแสดงภาษาไทย. (  https://stackoverflow.com/a/8218649/128761 )
	// LIBXML_HTML_NODEFDTD คือเพื่อให้ไม่ต้องวุ่นวายกับ doctype. ( http://php.net/manual/en/libxml.constants.php )
	$dom->loadHTML('<?xml encoding="utf-8" ?>' . $string, LIBXML_HTML_NODEFDTD);

	$table = $dom->getElementsByTagName('table')->item(0);
	if (is_object($table)) {
		$tbody = $table->getElementsByTagName($getElementName)->item(0);
		if (
			(
				// if required attribute and its value are false (not required).
				$requiredAttribute === false &&
				$requiredAttributeValue === false
			) ||
			(
				// if required attribute and its value are string, it must be validate.
				is_string($requiredAttribute) &&
				is_string($requiredAttributeValue) && 
				$tbody->hasAttribute($requiredAttribute) &&
				$tbody->getAttribute($requiredAttribute) === $requiredAttributeValue
			)
		) {
			return $tbody->ownerDocument->saveHTML($tbody);
		} else {
			// อาจเปลี่ยน throw error เป็นอย่างอื่นก็ได้ เช่น return false;
			throw new \Exception('Invalid html content (' . $getElementName . ' contain no attribute or wrong value for this attribute.).');
		}
		unset($tbody);
	} else {
		// อาจเปลี่ยน throw error เป็นอย่างอื่นก็ได้ เช่น return false;
		throw new \Exception('Invalid html content (table).');
	}
	unset($table);
}


/**
 * Make string into array format.
 * @param string $string
 * @return string|array Return array on success, return original content on failed.
 */
function makeArray($string)
{
	if (is_string($string)) {
		$array = array(
			array(
				0 => $string,
			)
		);
		return $array;
	}

	return $string;
}

echo '<h3>get html table inner content</h3>' . PHP_EOL;
echo printDebug(getHTMLTableInnerContent($str, 'tbody', 'parser-repeat', 'master_data'));
echo '<h4>make it array you want.</h4>' . PHP_EOL;
echo printDebug(makeArray(getHTMLTableInnerContent($str, 'tbody', 'parser-repeat', 'master_data')));


อันนี้มาแบบพร้อมใช้เลย น่าจะได้แล้วนะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2018-09-23 12:07:20 By : mr.v
 


 

No. 6



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



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

ตอบความคิดเห็นที่ : 3 เขียนโดย : Chaidhanan เมื่อวันที่ 2018-09-22 22:34:42
รายละเอียดของการตอบ ::
ไม่ได้ปิดครับ บน Localhost เปิดไว้ตลอดครับ
แต่พอรันแล้วมันเข้าลูปไม่รู้จบครับ apache ค้างไปเลยครับ ^^

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2018-09-23 13:38:32 By : {Cyberman}
 


 

No. 7



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



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

ตอบความคิดเห็นที่ : 5 เขียนโดย : mr.v เมื่อวันที่ 2018-09-23 12:07:20
รายละเอียดของการตอบ ::
ขอบคุณสำหรับตัวอย่างครับ เดี๋ยวจะลองเอาไปดับแปลงดูครับ


เพราะว่าฟังชั่นต่อจากนี้เขียนไว้เรียบร้อยแล้ว รันได้แล้วขาดแค่ $array[0][0] เท่านั้นเองครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2018-09-23 13:42:19 By : {Cyberman}
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : preg_match_all() ค้าง - รบกวนตรวจสอบโค้ดชุดนี้ และแนะนำวิธีแก้ไขให้หน่อยครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ 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 00
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 อัตราราคา คลิกที่นี่