Just nu i M3-nätverket
Gå till innehåll

Dela upp för långa ord


TicoRoman

Rekommendera Poster

Hur gör jag för att dela upp för långa textsträngar i en variabel?

 

tex:

 

$variabel = "en massa olika ord, samt ett låååååååångt ord";

 

Ett ord i variabeln får maximalt bestå av X tecken. Om det innehåller fler tecken så ska det delas upp med ett mellanslag efter X:te tecknet.

 

Vi kan anta att X=30.

 

Jag kommer inte på någon smart lösning. :S

 

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

[inlägget ändrat 2002-12-28 07:35:16 av TicoRoman]

Länk till kommentar
Dela på andra webbplatser

Det finns en funktion som heter Wordwrap, jag föreslår att du använder den.

 

Denna funktion ser helt enkelt till att en sträng byter rad efter givet antal tecken, oavsett om ett ord har 500 bokstäver eller inte.

 

Läs på om funktionen här: http://www.php.net/manual/en/function.wordwrap.php

 

OBS: Det har nyligen kommit in en buggrapport där det faktiskt går att göra en overflow på denna funktion. Dock är det ganska krångligt att göra det, så man kan kanske vara ganska säker ändå.

 

--

Some say I am crazy.. but the Voices in my head disagree...

 

Länk till kommentar
Dela på andra webbplatser

Ja, men det var inte riktigt det han efterfrågade.

 

Om vi antar att han driver ett forum, där man inte ska få skriva in för länga ord, då det förstör det grafiska upplägget på sidan, så har han inte så stor nytta av wordwrap() då den mest är till för fastbreddstext, och inte flytande text som i HTML.

 

Wordwrap kommer ju att alltid bryta rad vid t.ex. 30 tecken då, även om man inte vill ha en ny rad, utan bara uppdelning av ordet.

 

Om användaren också skriver en lång sträm med mellanrum, så kommer den ju ändå att bryta vid 30 tecken. Det gör inte min kod ovan...

 

Mitt tips är att inte använda wordwrap till detta. Den är till för konsol-program i mina ögon.

 

Länk till kommentar
Dela på andra webbplatser

Nja, istället för att använda standardutförandet av wordwrap kan man ju lägga in ett mellanslag i wordwrap funktionen, på detta sätt så kommer långa ord få ett mellanslag i sig och kommer då att brytas om det nu är så.

 

$newtext = wordwrap( $text, 40, " ", 1);

 

Som det diskuteras i "User Contributed Notes" så kan man ju även teoretiskt använda sig av en SHY (Soft Hyphen) vilket är ett tecken som inte syns, men om det används bryter ett ord och lägger dit ett streck (-). Tyvärr bryr sig inte alla browsers om detta vilket i annat fall hade varit det bästa alternativet IMHO.

 

Inget fel med din funktion Cariad, men wordwrap tror jag är snabbare om man ser till prestanda. Har för mig att du strävade efter att ha så effektiva program som möjligt? :)

 

--

Some say I am crazy.. but the Voices in my head disagree...

 

Länk till kommentar
Dela på andra webbplatser

Har för mig att du strävade efter att ha så effektiva program som möjligt?
Jo, det stämmer, men samtidigt ska de ju göra precis det jag vill att de ska göra också ;)

 

Om vi antar att man har följande sträng (ska vara en rad):

The Japanese government will start a joint research project...

 

Sedan använder vi oss av wordwrap med de argument du skrev ovan, så får vi följande resultat:

The Japanese government will start a joi nt research project...

 

Det är ju onödigt att bryta i ett så kort ord. Visst, jag håller med om att man kan lägga en en SHY, men jag föreslog inte detta ovan då det endast verkar fungera i IE > 4, och sådan kodning brukar jag inte uppmuntra ;)

 

Jag gjorde ett test med min kod ovan, och Bj0rns wordwrap-exempel på en 2487 tecken lång sträng.

Mitt exempel tog 917 mikrosekunder (0.00091695785522461 sekunder), och Bj0rns 133.

 

Vi har därmed fastställt att wordwrap() är betydligt snabbare, men även att det handlar om så otroligt liten tid att det egentligen inte spelar någon roll.

Om funktionen ska användas i ett forum, så kan man köra texten igenom denna funktion innan man sparar strängen i databasen, så slipper man göra det varje gång man hämtar texten.

 

Länk till kommentar
Dela på andra webbplatser

Om man även lägger till ett S efter /U i mitt reguljära uttryck, så går det ändå snabbare: 755 mikrosekunder.

 

Så här ska det alltså se ut då:

$x = 30;
$mod = preg_replace("/([^[:space:]]{" . $x . "})([^[:space:]]+)/US", "\\1 \\2", $sträng);

 

Länk till kommentar
Dela på andra webbplatser

Om vi antar att man har följande sträng (ska vara en rad):

The Japanese government will start a joint research project...

 

Sedan använder vi oss av wordwrap med de argument du skrev ovan, så får vi följande resultat:

The Japanese government will start a joi nt research project...

Det resultatet får i vilket fall inte jag. För mig bryts endast ord som är längre än 40 tecken. Jag testade det här:

 

<?php  

$text = "The Japanese government will start a joint research project...";

$newtext = wordwrap( $text, 40, " ", 1);

echo $newtext;

?>

 

Länk till kommentar
Dela på andra webbplatser

Jo, det stämmer, men samtidigt ska de ju göra precis det jag vill att de ska göra också ;)

 

Så sant så sant, men wordwrap gör ju precis det han vill göra, eller? Vad jag vet då jag har använt wordwrap funktionen så försöker den att inte klippa ord om den inte måste.

 

I exemplet med strängen som du angav "The Japanese government will start a joint research project..." så klipper wordwrap efter detta: "The Japanese government will start a" vilket är efter den 36 bokstaven. Detta eftersom det annars skulle klippa mitt innuti ett ord.

 

Däremot om ett ord skulle vara över 40 tecken så kommer funktionen att klippa vid det 40'e tecknet om jag har förstått det rätt.

 

Om funktionen ska användas i ett forum, så kan man köra texten igenom denna funktion innan man sparar strängen i databasen, så slipper man göra det varje gång man hämtar texten.

 

Jo visst kan man göra så. Men är det någonting jag själv strävar efter så är det att inte behandla strängar designmässigt innan jag stoppar in det i en databas. Ponera att jag vill använda samma text i ett annat skede, en WAP site till exempel, då måste jag ju ändra om hur den ska klippa. Så jag rekommenderar absolut inte att klippa innan du lägger in i databasen! Jag skulle heller aldrig till exempel lägga in nl2br funktionen då jag stoppar in data i en databas, eftersom nästa gång jag vill hämta ut informationen så kanske jag vill ha det i en pdf fil eller liknande, och då är det ju dumt med en massa br taggar där i. :)

 

Både ditt och wordwrap funktionen tycker jag fungerar tillfredställande, och detta som skrivs om i manualen kanske är ännu bättre eftersom det inte klipper i URLar (såvida det inte finns 40 tecken eller mer efter ett snedstreck):

 

$message = ereg_replace("([^ \/]{40})","\\1<wbr>",$text);

 

Det som är skönt med nästan all programmering är att det oftast går att lösa ett problem på flera olika sätt. Utmaningen blir sedan att optimera sin kod så mycket som möjligt då man har allting fungerande på det sätt man vill. Att optimera kan dock göras på flera sätt, är man smart optimerar man koden, är man rik köper man bara en till server. :)

 

--

Some say I am crazy.. but the Voices in my head disagree...

 

Länk till kommentar
Dela på andra webbplatser

Tack för svaren!

 

Funktionen ska användas i en/ett (??) community för att förhindra att för långa ord förstör layaouten på de ställen där användaren får skriva in egna texter.

 

Angående om texten ska "behandlas" innan de skrivs till databasen lr då den plockas ut:

 

Då texten alltid ska visas på ett bestämt sätt så gör jag alla formateringar INNAN texten läggs i databasen. Detta eftersom texten (oftast) endast skivs/ändras en enda gång men visas väldigt många gånger.

 

Så ja, nu gäller det bara att fixa fram ett idiotsäkert inloggningssystem. ;)

 

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

Länk till kommentar
Dela på andra webbplatser

en/ett (??) community

En community om man nu måste använda sig av svengelska, annars skulle jag säga "nätsamhälle" eller nåt liknande.

 

Jag brukar göra så att jag sparar originaldatat, och sedan även mellanlagrar (cachar) den formaterade datan.

Tar lite mer utrymme i anspråk (vilket oftast inte brukar vara något problem), men på så sätt kan man göra om utseendet när man vill, och samtidigt ha en snabb webbplats.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...