/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Skære i tekst
Fra : Jeppe Vesterbæk


Dato : 23-07-02 12:23

Hej gruppe.

Hej har en side med nyheder hentet fra en mySQL database.
Det skal først siges, at nogle af disse nyheder godt kan indeholde
html-koder.

Da længden af nyhederne kan variere meget, ønsker jeg at beskrære dem, så de
får en nogenlunde ens længde. Dette ville jeg umiddelbart gøre ved at tælle
antal ord i posten, men dog også begrænse antal linier, hvis det skulle være
en post med mange liniebrud.
Jeg finder antal ord og liner sådan:
function linier($streng){
$linier=explode("\n", $streng);
$antallinier=count($linier);
$ord = explode(" ", $streng);
$antalord = count($ord);
$t = "ORD: $antalord LINIER: $antallinier";
return $t;
}

Mit problem er når jeg skal beskære en post. Hvordan sikrer jeg mig, at jeg
ikke beskærer midt imellem f.eks. <b> og </b> ... var det tilfældet, ville
resten af siden jo blive fed.

/Jeppe



 
 
Johan Holst Nielsen (23-07-2002)
Kommentar
Fra : Johan Holst Nielsen


Dato : 23-07-02 15:44

> Mit problem er når jeg skal beskære en post. Hvordan sikrer jeg mig, at jeg
> ikke beskærer midt imellem f.eks. <b> og </b> ... var det tilfældet, ville
> resten af siden jo blive fed.

Den nemme og beskidte.. smid det ind i en tabel

<table>
<tr>
<td><b>sdklæsakas</td>
<td>jkdlæsaklæ</td>
</tr>
</table>

Ikke så pænt... men det virker...
Den lidt dummere ;)

Den snørklede

function LetsMeMakeSure($s) {
$count_b = substr_count($s, '<b>');
$count_b_end = substr_count($s, '<\b>');
while($count_b > $count_b_end) {
$s = $s."</b>";
}
//og så alle de andre
}

Den enkle... fjern alle tags :)

function StripTags($s) {
return eregi_replace("<[a-z0-9 '\"=]+>", "", $s);
}
(er ikke gennemtestet ) :)

mvh
Johan


Mads Lie Jensen (23-07-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 23-07-02 16:16

On Tue, 23 Jul 2002 16:43:36 +0200, Johan Holst Nielsen
<johan@weknowthewayout.com> wrote:

>Den enkle... fjern alle tags :)
>
>function StripTags($s) {
> return eregi_replace("<[a-z0-9 '\"=]+>", "", $s);
>}
>(er ikke gennemtestet ) :)

Det var nok lidt smartere at bruge php's indbyggede strip_tags() :

http://www.php.net/manual/en/function.strip-tags.php

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Directory Opus - nu også til windows - http://www.gpsoft.com.au

Johan Holst Nielsen (23-07-2002)
Kommentar
Fra : Johan Holst Nielsen


Dato : 23-07-02 16:29

>>function StripTags($s) {
>> return eregi_replace("<[a-z0-9 '\"=]+>", "", $s);
>>}
>>(er ikke gennemtestet ) :)
>
>
> Det var nok lidt smartere at bruge php's indbyggede strip_tags() :
>
> http://www.php.net/manual/en/function.strip-tags.php


:)
jep... har rent faktisk aldrig haft brug for det.. så kendte ikke lige
den funktion... nå man bliver stadig klogere :)

mvh
Johan


Mads Lie Jensen (23-07-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 23-07-02 17:32

On Tue, 23 Jul 2002 17:29:11 +0200, Johan Holst Nielsen
<johan@weknowthewayout.com> wrote:

>> Det var nok lidt smartere at bruge php's indbyggede strip_tags() :
>>
>> http://www.php.net/manual/en/function.strip-tags.php
>
>:)
>jep... har rent faktisk aldrig haft brug for det.. så kendte ikke lige
>den funktion... nå man bliver stadig klogere :)

Den er faktisk ret smart, fordi man kan angive tilladte html-tags. Så
kan man tillade folk at bruge <b>, <i> osv. uden at de kan smide en
</td> ind som ødelægger det hele, f.eks.

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Directory Opus - nu også til windows - http://www.gpsoft.com.au

Johan Holst Nielsen (23-07-2002)
Kommentar
Fra : Johan Holst Nielsen


Dato : 23-07-02 18:49

>>>Det var nok lidt smartere at bruge php's indbyggede strip_tags() :
>>>
>>>http://www.php.net/manual/en/function.strip-tags.php
>>
>>:)
>>jep... har rent faktisk aldrig haft brug for det.. så kendte ikke lige
>>den funktion... nå man bliver stadig klogere :)
>
>
> Den er faktisk ret smart, fordi man kan angive tilladte html-tags. Så
> kan man tillade folk at bruge <b>, <i> osv. uden at de kan smide en
> </td> ind som ødelægger det hele, f.eks.

Yep... helt rigtig... men en eventuel /td til at afslutte en tabel
skulle også gerne fjernes? Da man outputter dataen ind i tabellen... og
ikke kører det sammen!

Men right :) Det er en gammel funktion... kan se den også var med i PHP3
dagene... så den har jeg sikkert blot fået skudt ud af hovedet :) Det er
sku svært at huske alle dem man aldrig bruger :)

Men kunne godt tænke mig at vide hvorledes funktionen f.eks. forholder
sig til XHTML og om den tager samtlige tags med? Og evntuelt hvilke tags
den ikke tager med? Nogle der har lavet en test på det? :) Tager den
f.eks. også ugyldige tags væk ala <ajk> ?

mvh
Johan


Johan Holst Nielsen (23-07-2002)
Kommentar
Fra : Johan Holst Nielsen


Dato : 23-07-02 18:57

> Men kunne godt tænke mig at vide hvorledes funktionen f.eks. forholder
> sig til XHTML og om den tager samtlige tags med? Og evntuelt hvilke tags
> den ikke tager med? Nogle der har lavet en test på det? :) Tager den
> f.eks. også ugyldige tags væk ala <ajk> ?

Jeg lavede en test...

Den replacer <br />
Fint.. så ser det ud til XHTML også er understøttet...
Men det er også ugyldige tags der ryger...

f.eks.
<sdkl> ....

Så husk lige at den kan være farlig hvis det er ved brugerindtastning :)

mvh
Johan


Mads Lie Jensen (23-07-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 23-07-02 19:48

On Tue, 23 Jul 2002 19:57:28 +0200, Johan Holst Nielsen
<johan@weknowthewayout.com> wrote:

>Men det er også ugyldige tags der ryger...
>
>f.eks.
><sdkl> ....
>
>Så husk lige at den kan være farlig hvis det er ved brugerindtastning :)

Enhver browser med respekt for sig selv springer vel også let og elegant
over et sådant ugyldigt tag? (Ja, jeg ved jeg burde lige teste, men det
gider jeg ikke Altså uden at vise det.

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Directory Opus - nu også til windows - http://www.gpsoft.com.au

Johan Holst Nielsen (24-07-2002)
Kommentar
Fra : Johan Holst Nielsen


Dato : 24-07-02 07:56

>>Men det er også ugyldige tags der ryger...
>>
>>f.eks.
>><sdkl> ....
>>
>>Så husk lige at den kan være farlig hvis det er ved brugerindtastning :)
>
>
> Enhver browser med respekt for sig selv springer vel også let og elegant
> over et sådant ugyldigt tag? (Ja, jeg ved jeg burde lige teste, men det
> gider jeg ikke Altså uden at vise det.

Jep, men kan godt være problematisk...

Hvis man f.eks. har et debatfora hvor en bruger skriver:

:< bah bah bah :>

Vil de fleste browsere faktisk vise det... (i hvert fald IE)...
Mens at efter strip_tags() vil den kun vise et kolon...
(testede lige og det er rigtig)...

Så bare en ting man skal være opmærksom på :))

mvh
Johan


Peter Brodersen (23-07-2002)
Kommentar
Fra : Peter Brodersen


Dato : 23-07-02 23:10

On Tue, 23 Jul 2002 17:16:10 +0200, Mads Lie Jensen
<mads@gartneriet.dk> wrote:

>Det var nok lidt smartere at bruge php's indbyggede strip_tags() :

Det kan kun understreges. Som beskrevet senere i tråden er den ret
aggressiv, men ekstremt brugbar, hvis man skærer hårdt i teksten, idet
den også vil fjerne halve tags, fx hvis vores tekst er blevet skåret
til:

Dette er en test. <a href="http://www.domæ

Her vil den fjerne det halve tag - hvilket også er hvad vi ønsker i
dette tilfælde.
--
- Peter Brodersen

Jeppe Vesterbæk (23-07-2002)
Kommentar
Fra : Jeppe Vesterbæk


Dato : 23-07-02 22:56

Hej Johan

> Den nemme og beskidte.. smid det ind i en tabel

Jeps, havde allerede brugt den, synes dog også den var lidt "beskidt" ... ;)

> Den snørklede

Jeg brugte dit forslag her, meget lidt modificeret (se kode nederst i
posten -- den timede out med den while-sætning du havde skrevet, så jeg har
ændret den til en if). Virker rigtig godt.

Så tak for hjælpen med det ;). Har dog lige et sidespørgsmål: Når jeg nu
skal trimme min lange post ned, er der så en måde hvorpå jeg kan sikre, at
jeg ikke hakker et ord over?

/Jeppe

--------

function tjeckBrudteTags($t) {
$tilladte1 = array("<b>", "<i>", "<u>", "<ol"); // kun <ol da den godt kan
have class
$tilladte2 = array("</b>", "</i>", "</u>", "</ol>");

for ($i=0; $i<count($tilladte1); $i++) {
$count = substr_count($t, $tilladte1[$i]);
$count_end = substr_count($t, $tilladte2[$i]);
if ($count > $count_end) {
$t .= $tilladte2[$i];
$count--;
}
}
return $t;
}





Johan Holst Nielsen (24-07-2002)
Kommentar
Fra : Johan Holst Nielsen


Dato : 24-07-02 08:05

> Så tak for hjælpen med det ;). Har dog lige et sidespørgsmål: Når jeg nu
> skal trimme min lange post ned, er der så en måde hvorpå jeg kan sikre, at
> jeg ikke hakker et ord over?

Jep... lav en funktion :P

f.eks.

function StripSomething($s, $length=100) {
$TmpString = substr($s, 0, $length);
while(substr($TmpString, -1) != " ") {
$length--;
$TmpString = substr($s, 0, $length)
}
return string;
}

Det skulle virke...
$s = din sætning
$length = længden på sætningen...
Den cutter tilbage... du kan bare sætte den til at cutte frem
i stedet for ved at sætte length++

Leg selv med dem... :) Men nu har du sikker ideen...
Der er mange andre måder at gøre det på :) Så gør det du har lyst til :

mvh
Johan


Jeppe Vesterbæk (24-07-2002)
Kommentar
Fra : Jeppe Vesterbæk


Dato : 24-07-02 12:14

> Jep... lav en funktion :P

> Leg selv med dem... :) Men nu har du sikker ideen...
> Der er mange andre måder at gøre det på :) Så gør det du har lyst til :

Ah, jeps tak for startskudet. Jeg har nu udbygget den, så den ikke burde
hakke mine links over også (fanger vist ikke alle endnu :p).

Tak for hjælpen.

/Jeppe



kaasgaard (07-08-2002)
Kommentar
Fra : kaasgaard


Dato : 07-08-02 08:21

"Jeppe Vesterbæk" skrev d. 23-07-02 12:23 dette indlæg :
> Hej gruppe.
>
> Hej har en side med nyheder hentet fra en mySQL database.
> Det skal først siges, at nogle af disse nyheder godt kan indeholde
> html-koder.
>
> Da længden af nyhederne kan variere meget, ønsker jeg at beskrære dem,
så de
> får en nogenlunde ens længde. Dette ville jeg umiddelbart gøre ved at
tælle
> antal ord i posten, men dog også begrænse antal linier, hvis det
skulle være
> en post med mange liniebrud.
> Jeg finder antal ord og liner sådan:
> function linier($streng){
> $linier=explode("\n", $streng);
> $antallinier=count($linier);
> $ord = explode(" ", $streng);
> $antalord = count($ord);
> $t = "ORD: $antalord LINIER: $antallinier";
> return $t;
> }
>
> Mit problem er når jeg skal beskære en post. Hvordan sikrer jeg mig,
at jeg
> ikke beskærer midt imellem f.eks. <b> og </b> ... var det tilfældet,
ville
> resten af siden jo blive fed.
>
> /Jeppe
>
>

Hmm... den eneste løsning jeg lige kan tænke på bliver godt nok lidt
noget spaghetti-kode.

Du kan evt. lave en tæller der tæller forekomsten af <x> og </x> så du
får et array med

----------------------
| tag | forekomster |
=================
| <b> | 2 |
----------------------
| <i> | 1 |
----------------------
| ... | |
----------------------

Hver gang du møder <b> tæller du forekomster en op, når du møder </b>
tæller du en ned. Når du er der hvor du vil skære i teksten løber du
arrayet igennem. Hvis ike alle forekomsterne er 0 ved du at du skal
indsætte nogle slut-tags og hvilke.

Med lidt konstruktiv løkkestruktur kan det lade sig gøre lidt fikst.

Det bedste ville efter min mening være helt at strippe teksten for tags,
det kan du evt. gøre med kommandoen ereg_replace og så derefter beskære
teksten.

Håber det giver lidt input.

// Martin

--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"


Søg
Reklame
Statistik
Spørgsmål : 177505
Tips : 31968
Nyheder : 719565
Indlæg : 6408554
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste