ฉันจะดึงอักขระที่ไม่ใช่ตัวเลขและตัวอักษรออกจากสตริงและเว้นช่องว่างได้อย่างไร


99

ฉันต้องการสร้างนิพจน์ทั่วไปที่ลบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมด แต่เว้นช่องว่างไว้ นี่คือการล้างข้อมูลการค้นหาก่อนที่จะเข้าสู่ฐานข้อมูล นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

@search_query = @search_query.gsub(/[^0-9a-z]/i, '')

ปัญหาที่นี่คือการลบช่องว่างทั้งหมด แนวทางแก้ไขในการรักษาช่องว่าง?


ฉันไม่ได้พัฒนา Rails แต่ทำไมคุณถึงปล่อยให้ Rails ทำการฆ่าเชื้อไม่ได้?
Andrew Grimm

คำตอบ:


189

เพิ่มช่องว่างให้กับกลุ่มอักขระที่ถูกลบ:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')

4
พื้นที่ว่างไม่ได้ผลสำหรับฉันดังนั้น 'อาจเป็นตัวเลือก: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i,' ')
David Douglas

6
คำน้อยกว่าเล็กน้อย:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer

3
เพื่อความแม่นยำการทำเช่นนี้จะลบตัวอักษรที่เน้นเสียงทั้งหมดและอาจไม่สามารถปรับให้เข้ากับบางภาษาได้
Uelb

@DavidDouglas ที่ควรจะเป็น\sไม่ได้\\s
Dex

9

ในกรณีนี้ฉันจะใช้วิธีปัง (gsub! แทน gsub) เพื่อทำความสะอาดอินพุตอย่างถาวร

#permanently filter all non-alphanumeric characters, except _
@search_query.gsub!(/\W/,'')

วิธีนี้หลีกเลี่ยงสถานการณ์ที่ @seach_query ถูกใช้ที่อื่นในโค้ดโดยไม่ต้องทำความสะอาด


2
เวอร์ชันปังจะคืนค่าเป็นศูนย์หากไม่มีสิ่งใดที่ตรงกัน อาจไม่ใช่ผลลัพธ์ที่คุณต้องการหรือคาดหวัง จากเอกสาร"ดำเนินการแทนสตริง # gsub แทนค่าส่งคืนค่า str หรือไม่มีหากไม่มีการแทนที่หากไม่มีการบล็อกและไม่มีการแทนที่จะมีการส่งคืนตัวแจงนับแทน"
dft

2
ในตัวอย่างของเขาไม่ได้ใช้ค่าส่งคืนดังนั้นจึงไม่เกี่ยวข้องมากนัก
Jaap Haagmans

3

ฉันจะใช้วิธีการรวม แทนที่จะยกเว้นทั้งหมดยกเว้นตัวเลขฉันจะรวมเฉพาะตัวเลขเท่านั้น เช่น

@search_query.scan(/[\da-z\s]/i).join

0

อาจจะใช้ได้กับกรณีดังกล่าว:

# do not replace any word characters and spaces
@search_query = @search_query.gsub(/[^\w ]/g, '')

-3

คำตอบที่ดีกว่า (อย่างน้อยก็ในทับทิม) คือ:

@search_query.gsub!(/^(\w|\s*)/,'')

1
นี่จะเป็นการลบ (a) อักขระคำเดี่ยวหรือ (b) ช่องว่างจำนวนเท่าใดก็ได้จากจุดเริ่มต้นของสตริง ไม่เกี่ยวข้องกับคำถามโดยสิ้นเชิงดังนั้นจึงไม่ใช่คำตอบ
Sigi

2
ทำผิดพลาดครั้งใหญ่ .. ไม่รู้ว่าฉันคิดอะไรอยู่: = (
John Doe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.