ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => ข้อความที่เริ่มโดย: okgofun ที่ 11 กันยายน 2007, 12:06:58



หัวข้อ: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: okgofun ที่ 11 กันยายน 2007, 12:06:58
มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ?? อ่านคำถามแล้วอาจจะงงๆนะครับ

คือสมมุตินะครับ อย่างเช่นถ้าเราแยกค่าต่างๆ เช่น

$text = "hello|X|สวัสดี" ;
$ex = explode("|X|",$text) ;

// ผลลัพท์ที่ได้คือ ก็จะได้ค่าสองค่าคือ hello และ สวัสดี

แต่ทีนี้บางที ถ้าเราต้องกำหนดข้อมูลที่จะตรวจสอบ ซึ่งจะเป็น regular expression ซึ่งก็ต้องใช้คำสั่ง split ใช่ใหมหละครับ

เช่น

$text = "hello<b>สบายดีใหม</b><i>ครับ</i>" ;
$split = split("<b>(.*)<\/b>",$text) ; // ตัวอย่างเฉยๆนะครับ

พอแยกออกมาแล้ว ค่าที่ได้มันจะเป็น hello และ <i>ครับ</i>

แหะๆ  :D คือผมอยากได้ค่าที่อยู่ใน <b>(.*)</b> แบบนี้มากกว่าหนะครับ แต่รุ้จักเพียงแค่ split ที่ใช้เช็คแบบ regular exression ได้ แต่มันก็ได้แต่แยกค่าอะ ถ้าเราจะ grab ค่าจะเขียนยังไงดีอะครับ



หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: payu ที่ 11 กันยายน 2007, 12:52:53

หมายถึงต้องการคำว่า "สบายดีไหม" ใช่หรือป่าวครับ

ผมใช้วิธีนี้ครับ
โค๊ด:
if (preg_match('#<b>(.*)</b>#', $text, $match)) {
  echo $match[1];
}

$match[0] = ได้ค่า "<b>สบายดีใหม</b>"
$match[1] = จะเป็นค่า "สบายดีใหม" ที่ต้องการครับ




หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: okgofun ที่ 11 กันยายน 2007, 13:01:17

หมายถึงต้องการคำว่า "สบายดีไหม" ใช่หรือป่าวครับ

ผมใช้วิธีนี้ครับ
โค๊ด:
if (preg_match('#<b>(.*)</b>#', $text, $match)) {
  echo $match[1];
}

$match[0] = ได้ค่า "<b>สบายดีใหม</b>"
$match[1] = จะเป็นค่า "สบายดีใหม" ที่ต้องการครับ




อ่าา ใช่แล้วครับ ใช้ preg_match ได้เหรอครับ เอ่อ แล้วเครื่องหมาย # ก่อน <b> หมายถึงอะไรเหรอครับ แล้วเงื่อนไขการเขียน expression ระหว่าง eregi กับ preg มันต่างกันมากใหมอะครับ เห็นมันมีพวก /W อะไรก็ไม่รู้ ดูยากจัง หรือแทนค่าแบบเดียวกับคำสั่ง eregi ได้เลยครับ


หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: EThaiZone ที่ 11 กันยายน 2007, 13:12:05
# ในความหมายคือตัวลิมิตเตอร์ครับ

ต้องใช้ปิดหัวกะท้ายของ reg ที่ใส่ไว้ ในกรณีใช้ตระกูล preg อะ

แต่เป็นผมปกติผมใช้ / แฮะ
แต่ใช้ยาก ในกรณีกรองแท็ก (ต้องไป \ หน้าแท็กอื่นทุกครั้ง -*-)

เดียวหันมาใช้ # แทนบ้างดีกว่า  :)


หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: okgofun ที่ 11 กันยายน 2007, 13:17:14
่อ่าา ลองแล้วครับ preg_match

เอ? แล้วถ้าในข้อความ มันมี tag <b>ข้อความ</b> อยุ่หรือ tag อะครับ แบบนี้จะเอามาได้ยังไงหมด เพราะเหมือนว่าค่า index 0 มันเป็น tag แรกที่เจอเท่านั้นอะ

// example
$text = "สวัสดี <b>สบายดีใหม</b><i>ครับ</i>กินข้าวหรือยัง <b>คิดถึงนะ</b>จะบอกให้ <b>รักด้วย</b>" ;

if (preg_match('#<b>(.*)</b>#', $text, $match)) {
  echo $match[1];
}

มันจะได้แค่ค่าเดียวเองครับ คือ สบายดีใหม พวกค่าอื่นๆที่อยู่ใน tag ที่กำหนด เช่นคำว่า คิดถึงนะ,รักด้วย มันไม่ยอมออกหนะครับ

ผมควรเขียนยังไงเหรอครับ

** หลักๆคืออยากให้คล้ายๆกับ split ที่มันแยกออกมาเป็น array แต่อันนี้จะเอาข้อความเหล่านี้หลายๆข้อความให้กลายเป็น array (น่าจะต้องการเป็น array เพราะมันมีหลายข้อความในบางกรณี)

php มีคำสั่งพวกนี้ใหมครับ หรือต้องมาเขียนฟังก์ชั่นเพิ่มเติมเอาเอง กลัวเปลือง process


หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: payu ที่ 11 กันยายน 2007, 13:22:02

ใช้ function preg_match_all() ครับ

ผลลัพธ์อยู่ใน array index 1, 2, 3, ...



หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: okgofun ที่ 11 กันยายน 2007, 13:32:07

ใช้ function preg_match_all() ครับ

ผลลัพธ์อยู่ใน array index 1, 2, 3, ...



โอ๊วว !! ขอบคุณมากๆๆๆๆๆๆๆๆๆครับ  :-* ได้แล้ว เยๆ :D


หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: okgofun ที่ 11 กันยายน 2007, 13:38:51
# ในความหมายคือตัวลิมิตเตอร์ครับ

ต้องใช้ปิดหัวกะท้ายของ reg ที่ใส่ไว้ ในกรณีใช้ตระกูล preg อะ

แต่เป็นผมปกติผมใช้ / แฮะ
แต่ใช้ยาก ในกรณีกรองแท็ก (ต้องไป \ หน้าแท็กอื่นทุกครั้ง -*-)

เดียวหันมาใช้ # แทนบ้างดีกว่า  :)

เอ? ถ้าใช้แบบปิด tag ด้วย \ มันได้ผลครับ แต่ผมลองใช้ # แล้วไม่ปิดแต่ละอักขระพิเศษด้วย \ กลับไม่ได้ผลแฮะ

สงสัยต้องใช้ \ แล้วมานั่งปิด tag เหมือนเดิม เหนื่อยหน่อย เฮ้อ


หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมū
เริ่มหัวข้อโดย: EThaiZone ที่ 11 กันยายน 2007, 13:51:10
ส่วนมากหลายคนใช้แบบนี้ (.*)

แต่ความจริงถ้าอยากได้ผลลัพท์ดีๆ ผมแนะนำ

([^อะไรที่ไม่อยากจะเอา]*)

อย่าง ([^<>]*) ก็คือเอาทุกอย่างยกเว้น < กะ >

อย่างนี้อาจสบายใจกว่านะครับ  :)

ปล. ใช้ # แล้วก็ไม่ต้องปิดแท็กก็ได้นิครับ (ปิดแท็กที่ว่าคือ หมายถึงแท็ก html นะครับ ไม่ได้หมายถึงตัวลิมิเตอร์อะ)

preg_match("/<table(.*)>(.*)<\/table>/", $var , $match);

ตรงตัว \/  นี้แหละ  ถ้าไม่ \ กันหน้า /table
จะติด error ของตัวลิมิตเตอร์ =__="


หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ??
เริ่มหัวข้อโดย: payu ที่ 11 กันยายน 2007, 14:15:45
ความหมายของ # (pattern delimiter) คือว่า
ถ้าเราใช้ / เป็นตัวปิด pattern เราจะต้องใส่ cast character \ เข้าไปข้างหน้า </b> ครับ เพื่อไม่ให้มันเข้าใจผิดว่าจบ pattern แล้วนั่นเอง ...
แต่ถ้าเราใช้ # เป็นตัวปิดหัวท้าย .. การใช้ </b> แบบไม่ต้อง cast จึงไม่ทำให้มันเข้าใจผิดครับ ซึ่งง่ายกว่าต้องมา cast ทุกตัว (ถ้ามีเยอะ)
ส่วนตัวที่มีความหมายพิเศษตัวอื่นเช่น \s = space, \n = new line ยังคงต้อง cast ด้วย \ ตามปกติครับ

... ที่จริงเราสามารถใช้เครื่องหมายอะไรก็ได้้เป็น delimiter ครับเช่น / # หรือ %
แต่ที่นิยมใช้คือ / กับ # ครับ ... ใช้ # เพื่อไม่ให้ไปกวนกับตัวปิดแทก html นั่นเองจะได้ไม่ต้อง cast