Bir metin bloğundaki bir sözcük kısaltmak

6 Cevap php

Bazen benim sitenin düzeni patlak gerçekten uzun bir kelime / web adresi olan metnin bir blok var.

Bu metin bloğu geçmesi ve kelimeleri kısaltmak için en iyi yolu nedir?

EXAMPLE:

Bu bazı metin ve bu uzun bir kelime bu gibi görünür

fkdfjdksodifjdisosdidjsosdifosdfiosdfoisjdfoijsdfoijsdfoijsdfoijsdfoijsdfoisjdfoisdjfoisdfjosdifjosdifjosdifjosdifjosdifjsodifjosdifjosidjfosdifjsdoiofsij and i need that to either wrap in ALL browsers or trim the word.

6 Cevap

İhtiyacınız wordwrap fonksiyonu herhalde.

Sen truncate the string bu yüzden ortasında bir üç nokta veya dizenin sonunda görünür olabilir. Ancak, bu webbrowser gerçek işleme bağımsız olacaktır. Bir dize geri dönüş tiplerini tanımlanmış ve örneğin tarayıcıda kullanıldığı yazı bilmiyorum, özellikle eğer, bir tarayıcıda işlenen belli bir yazı ile olacak gerçek uzunluğunu belirlemek için PHP için hiçbir yolu yoktur

font-family: Verdana, Arial, sans-serif;

Aşağıdaki karşılaştırın:

I am 23 characters long
I am 23 characters long

Her iki karakter aynı uzunluğa sahiptir, ama bir monotyped ve diğer bu olacak gerçek genişliği değildir çünkü farklıdır. PHP bu belirleyemiyor. Sen, bir istemci tarafı teknoloji bulmak probably JavaScript, sizin için bu çözmek gerekiyor.

Ayrıca bir unsuru haline metni sarabilirdiniz CSS property overflow:hidden metin sabit bir süre sonra kaybolur yapmak.

SO etrafına bak. Bu daha önce bir kez daha sordu eminim.

Sen düzeni kırar metin sarmak için word-wrap: break-word CSS özelliğini kullanabilirsiniz.

Kullanımını göstermek the Mozilla Developer Center examples hangi edin.

function fixlongwords($string) {

$exploded = explode(' ', $string);
$result = '';
foreach($exploded as $curr) {
    if(strlen($curr) > 20) {
    $curr = wordwrap($curr, 20, '<br/>\n');
}
    $result .= $curr.' ';
}

return $result;

}

Bu işi yapmak gerekir.

Böyle bir şey yapabilirsiniz:

preg_replace("/(\\S{20})/", '$1&zwnj;', $text);

Bu * Tüm kelimeleri her 20 karakter içine sıfır genişlik olmayan katılması karakter eklemek gerekir. Bu da kelime-wrap olacak demektir.

* (denenmemiş)

JonnyLitt cevabı @ dayanarak, burada sorun almak benim:

<?php

function insertSoftBreak($string, $interval=20, $breakChr='&shy;') {
    $splitString = explode(' ', $string);
    foreach($splitString as $key => $val) {
        if(strlen($val)>$interval) {
            $splitString[$key] = wordwrap($val, $interval, $breakChr, true);
        }
    }
    return implode(' ', $splitString);
}

$string = 'Hello, My name is fwwfdfhhhfhhhfrhgrhffwfweronwefbwuecfbryhfbqpibcqpbfefpibcyhpihbasdcbiasdfayifvbpbfawfgawg, because that is my name.';
echo insertSoftBreak($string);

?>

Uzay-ayrılmış değerleri dize kesiliyor, her bireyin 'Kelime' uzunluğunu kontrol (kelime nokta, virgül, soru işareti veya benzeri semboller dahil). Her kelime için karakterin inci 'her $interval uzunluğu daha uzun $interval karakterden daha olup olmadığını kontrol edin, ve eğer öyleyse, bir &shy; (yumuşak tire) takın.

Nispeten tarayıcılar arasında iyi desteklenen gibi görünüyor çünkü ben yumuşak tire seçtim, ve kelime aslında bu konumda sarar sürece genellikle görünmüyor.

Ben (&zwnj; FF 3.6, en az çalışmak için görünmüyor) yerine kullanılabilecek başka bir kullanılabilir (ve de desteklenen) HTML varlıkların farkında değilim, eğer öyleyse {[(için crossbrowser destek 1)]} eksik çıkıyor, saf CSS veya Javascript tabanlı çözüm iyi olurdu.