Оновлення: Робота з цим в CSS напрочуд проста і з низькими накладними витратами, але ви не маєте контролю над тим, де виникають перерви, коли вони робляться. Це нормально, якщо вам все одно, або ваші дані давно буквено-цифрові пробіги без природних перерв. У нас було багато довгих шляхів до файлів, URL-адрес та номерів телефонів, усі вони мають місця, на які значно краще перерватися, ніж інші.
Нашим рішенням було спочатку скористатися заміною регулярного вираження, щоб поставити пробіл із нульовою шириною (& # 8203;) після кожні 15 (скажімо) символів, які не є пробілом або одним із спеціальних символів, де ми воліємо перерви. Потім робимо ще одну заміну, щоб розмістити пробіл із нульовою шириною після цих спеціальних символів.
Пробіли нульової ширини приємні, оскільки їх ніколи не видно на екрані; сором’язливі дефіси були заплутані, коли показували, бо дані мають значні дефіси. Пробіли з нульовою шириною також не включаються при копіюванні тексту з браузера.
Спеціальні символи перерви, які ми використовуємо в даний час, - це косою рискою вперед, косою рисою, комою, підкресленням, @, | та дефісом. Ви б не думали, що вам потрібно буде зробити що-небудь, щоб заохотити зламати після дефісів, але Firefox (принаймні 3,6 і 4) не ламається на дефісах, оточених цифрами (наприклад, номерами телефонів).
Ми також хотіли контролювати кількість символів між штучними перервами на основі наявного місця розташування. Це означало, що регулярний вираз, щоб відповідати довгим безвідривним пробігам, повинен бути динамічним. Це називається дуже багато, і ми не хотіли створювати однакові однакові регулярні вирази з міркувань продуктивності, тому ми використовували простий кеш-регекс, керований виразом регулярного виразів та його прапорами.
Ось код; ви, ймовірно, простір імен функцій в утиліті:
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: Отримати цей символ у даних уже не є теоретичною можливістю, це спостерігається проблема. Користувачі надсилають дані, скопійовані з екрана, вони зберігаються в db, перерви в пошуку, речі сортуються дивно тощо.
Ми зробили дві речі:
- Написав утиліту, щоб видалити їх із усіх стовпців усіх таблиць у всіх джерелах даних для цього додатка.
- Додано фільтрування, щоб видалити його до нашого стандартного струнного вхідного процесора, тому він минув час, коли якийсь код його побачить.
Це добре працює, як і сама техніка, але це застереження.
Оновлення 4: ми використовуємо це в контексті, коли дані, подані до цього, можуть бути уникнути HTML. При правильних обставинах він може вставляти проміжки нульової ширини в середині HTML-об'єктів, з цікавими результатами.
Виправлення полягало в тому, щоб додати ampersand до списку символів, на які ми не перебиваємось, наприклад:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');