หัวข้อ: มีแต่ 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)) { $match[0] = ได้ค่า "<b>สบายดีใหม</b>" $match[1] = จะเป็นค่า "สบายดีใหม" ที่ต้องการครับ หัวข้อ: Re: มีแต่ split ให้แยกค่าที่ต้องการออกมา แล้วมีวิธีเก็บค่าที่ต้องการเลยใหมครับ?? เริ่มหัวข้อโดย: okgofun ที่ 11 กันยายน 2007, 13:01:17 หมายถึงต้องการคำว่า "สบายดีไหม" ใช่หรือป่าวครับ ผมใช้วิธีนี้ครับ โค๊ด: if (preg_match('#<b>(.*)</b>#', $text, $match)) { $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 |