|
| streng-behandling Fra : Torben |
Dato : 18-06-09 15:05 |
|
Hej venner
Jeg har en streng af varierende længde. Jeg vil gerne sikre mig at kun
maks 300 tegn bliver vist. Hvis strengen er over 300 tegn, så vil jeg
skære strengen ved det sidste punktum før de 300 tegn.
$str = strip_tags( $artikel[ 'resume' ] );
$chars = preg_split('/ ????????????????????/', $str, -1,
PREG_SPLIT_OFFSET_CAPTURE);
Jeg mangler 'patern' for punktum mellemrum og stortbogstav.
Eller er der en meget smartere måde at gribe det an på.
| |
Michael Rasmussen (18-06-2009)
| Kommentar Fra : Michael Rasmussen |
Dato : 18-06-09 22:14 |
|
On Thu, 18 Jun 2009 14:04:51 -0700 (PDT)
Torben <ringsoe@gmail.com> wrote:
> Jeg har en streng af varierende længde. Jeg vil gerne sikre mig at kun
> maks 300 tegn bliver vist. Hvis strengen er over 300 tegn, så vil jeg
> skære strengen ved det sidste punktum før de 300 tegn.
>
Hvad hvis der ikke findes et punktum i de første 300 tegn?
--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.
| |
Torben (18-06-2009)
| Kommentar Fra : Torben |
Dato : 18-06-09 15:27 |
|
Michael skriver:
> Hvad hvis der ikke findes et punktum i de første 300 tegn?
Hvis der ikke er noget punktum så ... hm .... så skal den slutte med
sidste 'ord' enden de 300 tegn, efterfulgt af ...
Torben
| |
Preben (19-06-2009)
| Kommentar Fra : Preben |
Dato : 19-06-09 03:18 |
|
Torben wrote in dk.edb.internet.webdesign.serverside.php:
> Hvis der ikke er noget punktum så ... hm .... så skal den slutte med
> sidste 'ord' enden de 300 tegn, efterfulgt af ...
>
Er det kun punktum du leder efter?
$txt = 'en tekststreng som måske er længere end 300 tegn...';
$sub = substr($txt, 0, 300);
$txt = substr($sub, 0, strrpos($sub, '.')) ? $txt = substr($sub, 0,
strrpos($sub, '.')+1) : substr($sub, 0, strrpos($sub, ' '))."...";
Hvad hvis en sætning ender med (?) eller (!) og skal det evt.
efterfølges af mellemrum + stort bogstav?
(jeg er ikke god til regex, men måske noget i stil med flg.)
$txt = 'en tekststreng som måske er længere end 300 tegn...';
$sub = substr($txt, 0, 301);
$eol = array('.','?','!');
$pat = "/(\\".implode('|\\',$eol).")(?= [A-Z])/";
$split = preg_split($pat, $sub, -1, PREG_SPLIT_DELIM_CAPTURE);
if (count($split) > 1) {
$txt = '';
foreach ($split as $sub) {
if (strlen($txt) + strlen($sub) <= 300) {
$txt .= $sub;
} else break;
}
} else {
$txt = substr($sub, 0, strrpos($sub, ' '))."...";
}
Måske må strengen ikke fylde mere end 300 tegn, selvom der bliver
tilføjet (...)?
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Michael Rasmussen (19-06-2009)
| Kommentar Fra : Michael Rasmussen |
Dato : 19-06-09 00:49 |
|
On Thu, 18 Jun 2009 14:26:40 -0700 (PDT)
Torben <ringsoe@gmail.com> wrote:
> Michael skriver:
> > Hvad hvis der ikke findes et punktum i de første 300 tegn?
>
> Hvis der ikke er noget punktum så ... hm .... så skal den slutte med
> sidste 'ord' enden de 300 tegn, efterfulgt af ...
>
Nedenstående burde opfylde dine betingelser. Bemærk venligst, at det er
totalt utestet, så brugen af koden er på eget ansvar!
<?php
$str = "Dette er en lille test. stopper her. og så. alligevel ikke";
$max = 40;
if (strlen($str) > $max) {
$pos = strrpos($str, '.');
if ($pos === FALSE || $pos > $max) {
$parts = preg_split('/(\w+\.)\s+/', $str, 300, PREG_SPLIT_DELIM_CAPTURE);
print_r($parts); $str = '';
foreach ($parts as $part) {
$part = ($str == '') ? $part : $part . ' ';
if (strlen($part) > $max - 3 || strlen($str) > $max - 3) {
if ($str != '') {
while (($pos = strrpos($part, '')) > $max - 3)
$part = substr($part, 0, $pos);
$str .= substr($part, 0, $pos) . '...';
break;
}
else {
if (strlen($str) > $max - 3) {
while (($pos = strrpos($str, ' ')) > $max - 3)
$str = substr($str, 0, $pos); $str .= '...';
break;
}
else {
while (($pos = strrpos($part, ' ')) > $max - 3)
$part = substr($part, 0, $pos);
$str = $part . '...';
break;
}
}
}
$tmp = $str . $part;
if (strlen($tmp) > $max) {
if ($str[strlen($str) - 1] == '.')
break;
else {
$str .= '...';
break;
}
}
$str = $tmp;
}
}
else {
$str = substr($str, 0, $pos + 1);
}
}
echo "$str\n";
?>
--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.
| |
Bertel Lund Hansen (19-06-2009)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-06-09 10:13 |
|
Torben skrev:
> $str = strip_tags( $artikel[ 'resume' ] );
$display_string=substr($str,0,300);
$pos=strpos($display_string,'.');
if ($pos==false) $pos=strpos($display_string,' ');
if ($pos!==false)
$display_string=substr($display_string,0,$pos+1);
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Johan Holst Nielsen (19-06-2009)
| Kommentar Fra : Johan Holst Nielsen |
Dato : 19-06-09 10:27 |
|
Bertel Lund Hansen wrote:
> Torben skrev:
>
>> $str = strip_tags( $artikel[ 'resume' ] );
>
> $display_string=substr($str,0,300);
> $pos=strpos($display_string,'.');
> if ($pos==false) $pos=strpos($display_string,' ');
> if ($pos!==false)
> $display_string=substr($display_string,0,$pos+1);
Øhm... du splitter ved første punktum - ellers ved første mellemrum.
Tror de andre løsninger virker bedre - ellers skal du i hvert fald have
noget strrev ind over i ovenstående.
/Johan
| |
Birger Sørensen (19-06-2009)
| Kommentar Fra : Birger Sørensen |
Dato : 19-06-09 14:54 |
|
Johan Holst Nielsen skrev:
> Bertel Lund Hansen wrote:
>> Torben skrev:
>>
>>> $str = strip_tags( $artikel[ 'resume' ] );
>>
>> $display_string=substr($str,0,300);
>> $pos=strpos($display_string,'.');
>> if ($pos==false) $pos=strpos($display_string,' ');
>> if ($pos!==false)
>> $display_string=substr($display_string,0,$pos+1);
>
> Øhm... du splitter ved første punktum - ellers ved første mellemrum.
> Tror de andre løsninger virker bedre - ellers skal du i hvert fald have
> noget strrev ind over i ovenstående.
>
> /Johan
nej strpos skal være strrpos...
Birger
--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk
| |
Bertel Lund Hansen (19-06-2009)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-06-09 17:30 |
|
Birger Sørensen skrev:
> nej strpos skal være strrpos...
Pokkers. Det glemte jeg da jeg blev nødt til at skrive noget af
koden igen fordi Agent har en programfejl.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Johan Holst Nielsen (19-06-2009)
| Kommentar Fra : Johan Holst Nielsen |
Dato : 19-06-09 17:56 |
|
Birger Sørensen wrote:
> Johan Holst Nielsen skrev:
>> Bertel Lund Hansen wrote:
>>> Torben skrev:
>>>
>>>> $str = strip_tags( $artikel[ 'resume' ] );
>>>
>>> $display_string=substr($str,0,300);
>>> $pos=strpos($display_string,'.');
>>> if ($pos==false) $pos=strpos($display_string,' ');
>>> if ($pos!==false)
>>> $display_string=substr($display_string,0,$pos+1);
>>
>> Øhm... du splitter ved første punktum - ellers ved første mellemrum.
>> Tror de andre løsninger virker bedre - ellers skal du i hvert fald have
>> noget strrev ind over i ovenstående.
>>
>> /Johan
>
> nej strpos skal være strrpos...
;) Yeah - det var også en mulighed.
/Johan
| |
Torben (19-06-2009)
| Kommentar Fra : Torben |
Dato : 19-06-09 06:12 |
|
> Michael Rasmussen <m...@miras.org> wrote:
> Nedenstående burde opfylde dine betingelser. Bemærk venligst, at det er
> totalt utestet, så brugen af koden er på eget ansvar!
Glimrende! Koden fungerer 'næsten'... Der er rigtignok som Preben
skriver tilfælde, hvor også ?, ! kan være afslutning fremfor .
(punktum).
Dertil kommer at kr. efterfulgt af et tal skal ikke splitte
tekststrengen. Generelt er det vel kun hvor . ? eller ! efterfølges af
et stort bogstav, der skal splitte.
Jeg ved jeg er ude i noget der får slev de mere drevne kodenørder til
at bryde grædende sammen. Jeg har det på samme måde. Og især når
regulær expressions skal match danske tegn også.
> $parts = preg_split('/(\w+\.)\s+/', $str, 300, PREG_SPLIT_DELIM_CAPTURE);
Hm... hvis jeg så lykkes med at matche (punktum mellemrum og stort
bogstav ikke tal) så ryger jeg vel ind i det problem at den splitter
strengen forkert...?
| |
|
|