Güncelleme: Bunu CSS'de ele almak oldukça basit ve düşük ek yüktür, ancak kırılmaların nerede gerçekleştiği konusunda hiçbir kontrolünüz yoktur. Umursamıyorsanız veya verilerinizde herhangi bir doğal ara vermeden uzun alfanümerik çalışmalar varsa sorun olmaz. Çok sayıda uzun dosya yolumuz, URL'miz ve telefon numaramız vardı, bunların hepsinin kırılması diğerlerinden daha iyi yerlere sahip.
Çözümümüz, boşluk olmayan her 15 karakterden (veya araları tercih ettiğimiz özel karakterlerden biri) sonra sıfır genişlikli bir boşluk (& # 8203;) koymak için önce normal ifade yerine kullanmaktı. Daha sonra, bu özel karakterlerin arkasına sıfır genişliğinde bir boşluk koymak için başka bir değişiklik yaparız.
Sıfır genişlikli alanlar güzeldir, çünkü ekranda hiç görünmezler; utangaç tireler gösterdiklerinde kafa karıştırıcıydı, çünkü veriler önemli tirelere sahip. Metni tarayıcıdan kopyaladığınızda sıfır genişlikli alanlar da dahil edilmez.
Şu anda kullandığımız özel kesme karakterleri nokta, eğik çizgi, ters eğik çizgi, virgül, alt çizgi, @, | ve kısa çizgi'dir. Kısa çizgilerden sonra kırılmayı teşvik etmek için herhangi bir şey yapmanız gerekmeyeceğini düşünmezsiniz, ancak Firefox (en az 3.6 ve 4) sayılarla çevrelenmiş tire işaretlerinde (telefon numaraları gibi) kendi başına kırılmaz.
Ayrıca, mevcut düzen alanına göre yapay molalar arasındaki karakter sayısını kontrol etmek istedik. Bu, uzun ve kesintisiz çalışmalarla eşleşecek normal ifadenin dinamik olması gerektiği anlamına geliyordu. Bu çok denir ve performans nedenleriyle aynı özdeş regex'leri tekrar tekrar oluşturmak istemedik, bu nedenle regex ifadesi ve bayrakları ile anahtarlanan basit bir regex önbellek kullandık.
İşte kod; muhtemelen bir yardımcı program paketindeki işlevleri adlandırırsınız:
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 = {};
Bu şekilde test edin:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
2 güncelle: Aslında sıfır genişlikli aralıkların görünür olan en azından bazı durumlarda kopyalanan metninde yer, sadece onları göremez. Açıkçası, insanları gizli karakterleri olan metinleri kopyalamaya teşvik etmek, başka programlara veya sistemlere, hatta kendinize bile, sorunlara neden olabileceği gibi verilerin girilmesi için bir davettir. Örneğin, bir veritabanında sonlanırsa, buna karşı yapılan aramalar başarısız olabilir ve bunun gibi arama dizelerinin de başarısız olması muhtemeldir. Bunun gibi veriler arasında gezinmek için ok tuşlarını kullanmak, göremediğiniz karakter arasında hareket etmek için (doğru olarak) fazladan bir tuşa basmayı gerektirir, kullanıcılar fark ederlerse biraz tuhaftır.
Kapalı bir sistemde, kendinizi korumak için bu karakteri girişe göre filtreleyebilirsiniz, ancak bu diğer programlara ve sistemlere yardımcı olmaz.
Her şey söylendi, bu teknik iyi çalışıyor, ancak kırılmaya neden olan karakterin en iyi seçiminin ne olacağından emin değilim.
Güncelleme 3: Bu karakterin verilere ulaşması artık teorik bir olasılık değil, gözlenen bir problem. Kullanıcılar ekrandan kopyalanan verileri gönderir, db'ye kaydedilir, aralar kesilir, işler garip bir şekilde sıralanır.
İki şey yaptık:
- Bu uygulama için tüm veri kaynaklarındaki tüm tabloların tüm sütunlarından kaldırmak için bir yardımcı program yazdı.
- Standart dize giriş işlemcimize kaldırmak için filtreleme eklendi, böylece herhangi bir kod gördüğü zaman gitti.
Bu, tekniğin kendisi gibi iyi çalışır, ancak bu bir uyarıcı masaldır.
Güncelleme 4: Bunu, beslenen verinin HTML'den kaçabileceği bir bağlamda kullanıyoruz. Doğru koşullar altında, HTML varlıklarının ortasına sıfır genişlikli boşluklar ekleyebilir.
Düzeltme, kırılmadığımız karakter listesine, ve işareti eklemekti, şöyle:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');