ปรับปรุง:จัดการสิ่งนี้ใน CSS นั้นเรียบง่ายและยอดเยี่ยม แต่คุณไม่สามารถควบคุมได้ว่าจะเกิดการหยุดพักเมื่อใด ไม่เป็นไรถ้าคุณไม่สนใจหรือข้อมูลของคุณมีตัวอักษรและตัวเลขที่ยาววิ่งโดยไม่มีการหยุดพักตามธรรมชาติ เรามีเส้นทางไฟล์ยาว ๆ URL และหมายเลขโทรศัพท์มากมายซึ่งทั้งหมดนี้มีที่ที่ดีกว่าที่อื่น ๆ
วิธีการแก้ปัญหาของเราคือการใช้การแทนที่ regex เป็นครั้งแรกเพื่อใส่ช่องว่างที่มีความกว้างเป็นศูนย์ (& # 8203;) หลังจากอักขระ 15 ตัวทุกตัวที่ไม่ใช่ช่องว่างหรือหนึ่งในอักขระพิเศษที่เราต้องการพัก จากนั้นเราจะทำการแทนที่อื่นเพื่อใส่ช่องว่างที่มีความกว้างเป็นศูนย์หลังจากอักขระพิเศษเหล่านั้น
ช่องว่างที่มีความกว้างเป็นศูนย์นั้นดีเพราะไม่เคยปรากฏบนหน้าจอเลย ยัติภังค์ขี้อายกำลังสับสนเมื่อพวกเขาแสดงเพราะข้อมูลมียัติภังค์สำคัญ ช่องว่างที่มีความกว้างเป็นศูนย์จะไม่รวมอยู่เมื่อคุณคัดลอกข้อความออกจากเบราว์เซอร์
อักขระหยุดพักพิเศษที่เรากำลังใช้งานอยู่คือเครื่องหมายจุด, เครื่องหมายสแลช, แบ็กสแลช, เครื่องหมายจุลภาค, เครื่องหมายขีดล่าง, @, | และเครื่องหมายขีดคั่น คุณไม่คิดว่าคุณจะต้องทำอะไรเพื่อกระตุ้นให้เกิดการแตกหลังจากยัติภังค์ แต่ Firefox (อย่างน้อย 3.6 และ 4) จะไม่แยกตัวเองที่เครื่องหมายขีดคั่นที่ล้อมรอบด้วยตัวเลข (เช่นหมายเลขโทรศัพท์)
นอกจากนี้เรายังต้องการควบคุมจำนวนตัวละครระหว่างตัวละครปลอมตามพื้นที่ว่างที่มี นั่นหมายความว่าการ regex เพื่อให้ตรงกับการวิ่งไม่หยุดยาวจำเป็นต้องเป็นแบบไดนามิก สิ่งนี้ได้รับการเรียกว่ามากและเราไม่ต้องการสร้าง regexes ที่เหมือนกันเหมือนเดิมซ้ำ ๆ กันเพื่อเหตุผลด้านประสิทธิภาพดังนั้นเราจึงใช้แคช regex ง่าย ๆ โดยใช้นิพจน์ regex และแฟล็กของมัน
นี่คือรหัส; คุณอาจตั้งชื่อฟังก์ชั่นในชุดโปรแกรมอรรถประโยชน์
makeWrappable = function(str, position)
{
if (!str)
return '';
position = position || 15; // default to breaking after 15 chars
// matches every requested number of chars that's not whitespace or one of the special chars defined below
var longRunsRegex = cachedRegex('([^\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^\\s\\.\/\\,_@\\|-])', 'g');
return str
.replace(longRunsRegex, '$1​') // put a zero-width space every requested number of chars that's not whitespace or a special char
.replace(makeWrappable.SPECIAL_CHARS_REGEX, '$1​'); // and one after special chars we want to allow breaking after
};
makeWrappable.SPECIAL_CHARS_REGEX = /([\.\/\\,_@\|-])/g; // period, forward slash, backslash, comma, underscore, @, |, hyphen
cachedRegex = function(reString, reFlags)
{
var key = reString + (reFlags ? ':::' + reFlags : '');
if (!cachedRegex.cache[key])
cachedRegex.cache[key] = new RegExp(reString, reFlags);
return cachedRegex.cache[key];
};
cachedRegex.cache = {};
ทดสอบเช่นนี้
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
อัพเดท 2:ปรากฏว่าพื้นที่ศูนย์ความกว้างในความเป็นจริงจะถูกรวมอยู่ในข้อความที่คัดลอกอย่างน้อยบางกรณีคุณก็ไม่สามารถเห็นพวกเขา เห็นได้ชัดว่าการกระตุ้นให้ผู้คนคัดลอกข้อความด้วยตัวอักษรที่ซ่อนอยู่ในนั้นเป็นคำเชิญให้มีข้อมูลเช่นนั้นเข้ามาในโปรแกรมหรือระบบอื่น ๆ แม้แต่ของคุณเองซึ่งมันอาจทำให้เกิดปัญหา ตัวอย่างเช่นหากมันสิ้นสุดลงในฐานข้อมูลการค้นหาอาจล้มเหลวและสตริงการค้นหาเช่นนี้ก็มีแนวโน้มที่จะล้มเหลวเช่นกัน การใช้ปุ่มลูกศรเพื่อย้ายข้อมูลเช่นนี้ต้องใช้ปุ่มกดพิเศษ (ถูกต้อง) เพื่อเลื่อนไปตามอักขระที่คุณมองไม่เห็น แต่ค่อนข้างแปลกสำหรับผู้ใช้หากพวกเขาสังเกตเห็น
ในระบบปิดคุณสามารถกรองอักขระนั้นบนอินพุตเพื่อป้องกันตัวคุณเอง แต่นั่นไม่ได้ช่วยโปรแกรมและระบบอื่น ๆ
ทั้งหมดบอกว่าเทคนิคนี้ใช้งานได้ดี แต่ฉันไม่แน่ใจว่าตัวเลือกที่ดีที่สุดในการทำลายตัวละครจะเป็นอย่างไร
อัปเดต 3:การที่ตัวละครนี้จบลงในข้อมูลนั้นไม่มีความเป็นไปได้ทางทฤษฎีอีกต่อไปมันเป็นปัญหาที่สังเกตได้ ผู้ใช้ส่งข้อมูลที่คัดลอกออกจากหน้าจอจะได้รับการบันทึกในฐานข้อมูลการค้นหาแตกการเรียงลำดับแปลก ๆ ฯลฯ
เราทำสองสิ่ง:
- เขียนยูทิลิตี้เพื่อลบออกจากคอลัมน์ทั้งหมดของตารางทั้งหมดในแหล่งข้อมูลทั้งหมดสำหรับแอพนี้
- เพิ่มการกรองเพื่อลบออกไปยังตัวประมวลผลอินพุตสตริงมาตรฐานของเราดังนั้นจึงเป็นไปตามเวลาที่รหัสใด ๆ เห็น
มันใช้งานได้ดีเช่นเดียวกับเทคนิค แต่มันเป็นเรื่องเตือน
อัปเดต 4:เรากำลังใช้สิ่งนี้ในบริบทที่ข้อมูลที่ป้อนให้กับสิ่งนี้อาจถูกหลบหนีจาก HTML ภายใต้สถานการณ์ที่เหมาะสมสามารถแทรกช่องว่างที่มีความกว้างเป็นศูนย์ในเอนทิตี HTML ที่มีผลลัพธ์ที่น่าสนใจ
แก้ไขคือการเพิ่มเครื่องหมายและรายการของตัวละครที่เราไม่ได้ทำลายเช่นนี้
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');