แสดงว่าcodeคุณไม่ใช่แบบที่ยกตัวอย่างมาแน่นอน อาจเป็นcodeที่เข้ารหัสมาเช่น ฿ ;
ใช่ครับ จริงๆแล้วมันเป็น form ครับ ถูก submit มาเก็บไว้ใน variable แล้วคราวนี้จะเอาเครื่องหมายนั่นออก แต่เรื่องถูกเข้ารหัสผมก็ไม่แน่ใจว่าทำไมมันจะอยู่ดีๆเข้ารหัส ( ไม่มีความรู้ ) แต่ที่แปลกคือ ถ้าผม โค๊ดของท่านนี้
$str = "฿21.58";
$val1 = preg_replace("/([^0-9\.,-])/", "", $str);
echo floatval($val1);
แทนที่มันจะ echo 21.58 แต่เป็น 364721.58 ไม่รู้ว่า ไอเลข 3647 มาจากใหน ก็เลยต้อง str_replace เอา 3647 ออกอีกที
*ถ้าผ่านมาอีกทีก็ช่วยอธิบายหน่อยครับว่า เลย 3647 มาจากใหน

+1 ทั้ง 2 ท่านครับ

เป็นเพราะว่า ฿ ของคุณไม่ได้มาจากตัว ฿ จริงๆ แต่มันมีการไปเข้ารหัสมัน (คงใช้ htmlentities()) ทำให้มันกลายเป็น ฿ ซึ่งไอ้ตัว ฿ นี่เองที่เมื่อเรนเดอร์ผ่านเบราเซอร์แล้วจะเป็นตัว ฿
ทางแก้ คุณอาจต้องหาทางทำให้มันกลับมาเป็นตัวอักษรของมันเองก่อน แล้วทำการ preg_replace หรืออาจทำการ preg_replace พวกคำที่ขึ้นต้นด้วย & และจบด้วย ; ให้มันว่างเปล่าก่อน.
echo html_entity_decode("฿", ENT_QUOTES, "UTF-8")."<br />\n";