ลบอักขระที่ไม่ใช่ตัวเลข (ยกเว้นเครื่องหมายจุดและเครื่องหมายจุลภาค) ออกจากสตริง


150

หากฉันมีค่าต่อไปนี้:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

ฉันจะสร้างตัวแปรใหม่และตั้งเป็นสำเนาของข้อมูลที่ลบอักขระที่ไม่ใช่ตัวเลขใด ๆ ยกเว้นคอมม่าและจุดต่าง ๆ ได้อย่างไร ค่าข้างต้นจะส่งคืนผลลัพธ์ดังต่อไปนี้:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

คำตอบ:


335

คุณสามารถใช้preg_replaceเพื่อสลับอักขระที่ไม่ใช่ตัวเลขทั้งหมดและเครื่องหมายจุลภาคและจุด / หยุดเต็มดังนี้:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>

6
ดูเพิ่มเติมฟังก์ชัน PHP money_function () ( php.net/manual/en/function.money-format.php )
horatio

5
[^ 0-9] จะจับคู่อักขระที่ไม่ใช่ตัวเลขใด ๆ ดังนั้นจึงไม่จำเป็นต้องเพิ่มเครื่องหมายจุลภาคและการหยุดแบบเต็ม นี่เพียงพอแล้ว: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
บิลเลียด

6
@ บิลริชาร์ดฉันไม่คิดว่าถูกต้อง โปรดจำไว้ว่าเขาต้องการคงเครื่องหมายจุลภาคและหยุดเต็มพร้อมด้วยอักขระตัวเลขไม่ใช่ลบออก
Richt222

1
@billrichards ตามที่ระบุไว้ OP (เน้นการเน้นของฉัน), "หลีกเลี่ยงตัวอักษรหรือตัวอักษรยกเว้นเครื่องหมายจุลภาคและจุด "
John Parker

ช่วงเวลานั้นไม่จำเป็นต้องใช้แบ็กสแลช ระยะเวลาหมายถึง "ตัวละครใด ๆ " ไม่ได้หรือไม่
สกอตต์

66

ฉันประหลาดใจที่ไม่มีการกล่าวถึงfilter_varที่นี่สำหรับคำถามนี้ ...

PHP ได้สร้างขึ้นในวิธีการของการทำเช่นนี้โดยใช้ฟิลเตอร์ฆ่าเชื้อ โดยเฉพาะอย่างยิ่งสิ่งที่จะใช้ในสถานการณ์นี้คือFILTER_SANITIZE_NUMBER_FLOATกับFILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDธง ชอบมาก

$numeric_filtered = filter_var("AR3,373.31", FILTER_SANITIZE_NUMBER_FLOAT,
    FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);
echo $numeric_filtered; // Will print "3,373.31"

มันอาจจะคุ้มค่าที่จะต้องทราบว่าเพราะมันติดตั้ง PHP ไว้แล้วจึงเร็วกว่าการใช้ regex กับไลบรารี่ปัจจุบันของ PHP เล็กน้อย (แม้ว่าจะเป็นอักษรนาโนวินาที)


2
IMO นี่คือคำตอบที่ดีที่สุด
Ogier Schelvis


4

คุณสามารถใช้filter_varเพื่อลบอักขระที่ผิดกฎหมายทั้งหมดยกเว้นตัวเลขจุดและเครื่องหมายจุลภาค

  • FILTER_SANITIZE_NUMBER_FLOATกรองใช้ในการลบทุกตัวละครที่ไม่ใช่ตัวเลขจากสตริง
  • FILTER_FLAG_ALLOW_FRACTION อนุญาตให้แยกเศษส่วน " . "
  • วัตถุประสงค์ของFILTER_FLAG_ALLOW_THOUSANDการรับเครื่องหมายจุลภาคจากสตริง

รหัส

$var1 = '12.322,11T';

echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);

เอาท์พุต

12.322,11

หากต้องการอ่านเพิ่มเติมเกี่ยวกับfilter_var ()และSanitize filter


2

หากคำขอคือการลบทั้งหมด (และไม่เพียงหนึ่ง) ไม่ใช่ถ่านตัวเลขบางทีก่อนหน้านี้สามารถเขียนได้เช่นนี้ในวิธีที่ง่ายมาก (แต่คุณสามารถเขียนฟังก์ชั่นที่จะผ่านสตริงและทำให้มันกลับค่าที่ต้องการโดยไม่ต้อง chars .. อย่างไรก็ตาม..):

<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>

1

หากตัวอักษรอยู่ในจุดเริ่มต้นหรือตอนท้ายคุณสามารถใช้เล็มได้ ... ไม่ต้องใช้ regex

$string = trim($string, "a..zA..Z"); // this also take care of lowercase

"AR3,373.31" --> "3,373.31"
"12.322,11T" --> "12.322,11"
"12.322,11"  --> "12.322,11"

สำคัญ: นี่จะเป็นการลบตัวอักษรออกจากสตริงเท่านั้น อักขระอื่น ๆ เช่นช่องว่างวงเล็บเครื่องหมายคำพูด ฯลฯ จะถูกเก็บไว้ในผลลัพธ์ -> ใช้วิธีนี้ถ้าคุณรู้ว่าสายป้อนของคุณมีตัวอักษรและตัวเลขเท่านั้นและไม่มีตัวอักษรอื่น!
ฟิลิปป์

-1

คำตอบเดียวกับ middaparka แต่ลบ,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);

โปรดอย่าเพิ่มลิงค์ไปยังบล็อก / ไซต์ของคุณในโพสต์ อาจถือได้ว่าเป็นสแปม
Tushar

Downvote: เพราะคำตอบของ middaparka นั้นสมบูรณ์แบบ OP ต้องการเก็บจุดและเครื่องหมายจุลภาค แต่คำตอบของคุณลบออก
Carlos2W
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.