html 'wegfilteren' in substr (Opgelost)
Solix - 03/07/2007 10:46
Nieuw lid
Ik ben bezig met een blogsysteem. In dat systeem heb je aan de rechterkant een vak waar de laatste vijf berichten staan (de eerste 20 tekens ervan). En daar kun je op klikken om het te hele bericht te bekijken.
Maar, als iemand bijvoorbeeld in de eerste regel van zijn bericht, helemaal vooraan in de zin, een link heeft, dan heb je aan de rechterkant dus een link in een link. Of een tag die niet meer afgesloten wordt, etc. etc..
Ik gebruik nu:
print substr($row['text'],0,20);
Binnen die substr moet hij dus alles dat tussen een '<' en een '>' staat wegfilteren, en ook niet meetellen met die 20 tekens.
Iemand enig idee hoe ik dit kan doen?
7 antwoorden
Gesponsorde links
Grayen - 03/07/2007 11:08
PHP ver gevorderde
Ik zat met een zelfde soort iets, daarvoor heb ik deze functie geschreven, uiteraard kan je hem zelf aanpassen naar eigen wens. Ik had graag dat hij paragrafen in stand hield, dus heb daar rekening mee gehouden, dat kan je natuurlijk weglaten.
function short($sString, $iLength)
{
if(strpos($sString, '<') !== false)
{
$sString = strip_tags(str_replace(array('<p>', '</p>', '<br/>'), array("\n\n", '', "\n"), $sString));
}
$sString = (strlen($sString) > ($iLength + 20) ? substr($sString, 0, $iLength).'... ' : $sString);
$aParagraphs = explode("\n\n", $sString);
foreach($aParagraphs as $i => $sParagraph)
{
$aParagraphs[$i] = empty($sParagraph) === false ? '<p>'.$sParagraph.'</p>' : '';
}
return implode('', $aParagraphs);
}
function short( $sString , $iLength )
{
if ( strpos ( $sString , '<' ) !== false ) {
}
$sString = ( strlen ( $sString ) > ( $iLength + 20 ) ?
substr ( $sString , 0 , $iLength ) . '... ' : $sString ) ;
$aParagraphs = explode ( "\n \n " , $sString ) ; foreach ( $aParagraphs as $i => $sParagraph )
{
$aParagraphs [ $i ] = empty ( $sParagraph ) === false ?
'<p>' . $sParagraph . '</p>' : '' ; }
}
En het gebruik is als volgt:
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
print short($string, 20); // output: aaaaaaaaaaaaaaaaaaaa
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ;
print short
( $string , 20 ) ; // output: aaaaaaaaaaaaaaaaaaaa
Anoniem - 03/07/2007 11:12 (laatste wijziging 03/07/2007 11:12)
PHP gevorderde
Dus eigenlijk gewoon:
<?php
print substr(strip_tags($row['text'],0,20));
?>
gothmog - 03/07/2007 11:50
Lid
Orange, dan bdl jij:
<?php
print substr(strip_tags($row['text']),0,20);
?>
Solix - 03/07/2007 11:54
Nieuw lid
Er passen geen paragrafen binnen 20 tekens. En de manier van Orange werkt ook prima (die gebruik ik, bedankt!). Maar jij ook bedankt voor je reply, Grayen!
Rik - 03/07/2007 12:04 (laatste wijziging 03/07/2007 12:14)
Crew algemeen
Ik heb een functie gemaakt die tekst inkort, maar wel html tags laat staan:
<?php
function shorten($data, $length = 20, $endString = '...') {
$regex = array(
'open' => '/\<[ ]*([a-z]+)[ ]*(?:[a-z]*[ ]*\=[ ]*\"[^\"\']*\")*[ ]*\/?[ ]*\>/',
'close' => '/\<[ ]*\/[ ]*%s+[ ]*\>/s'
);
$short = '';
$length -= strlen($endString);
$free = $length;
for ($i = 0; $i < strlen($data) && $free > 0; $i++) {
if ($data{$i} == '<' && ($pos = strpos($data, '>', $i + 1)) !== false) {
$open = substr($data, $i, ($pos - $i + 1));
$i = $pos;
if (preg_match($regex['open'], $open, $match) && preg_match(sprintf($regex['close'], $match[1]), substr($data, $pos), $match)) {
$close = $match[0];
$value = shorten(substr($data, $i + 1, strpos($data, $close, $i) - $i - 1), $free, '');
$i = strpos($data, $close, $i) + strlen($close) - 1;
$free -= strlen($value);
$short .= $open . $value . $close;
continue;
}
}
$short .= $data{$i};
$free--;
}
return $short . $endString;
}
$data = '<em>Zoek met <a href="http://www.google.nl"><b>Google</b></a>!</em>';
echo shorten($data, 20);
?>
<?php
function shorten( $data , $length = 20 , $endString = '...' ) {
'open' => '/\<[ ]*([a-z]+)[ ]*(?:[a-z]*[ ]*\=[ ]*\"[^\"\' ] * \")*[ ]*\/?[ ]*\>/',
'close' => '/\<[ ]*\/[ ]*%s +[ ]*\>/s'
);
$short = '';
$length -= strlen($endString );
$free = $length ;
for ($i = 0; $i < strlen($data ) && $free > 0; $i ++) {
if ($data {$i} == '<' && ($pos = strpos($data , '>', $i + 1)) !== false) {
$open = substr($data , $i , ($pos - $i + 1));
$i = $pos ;
if (preg_match($regex ['open'], $open , $match ) && preg_match(sprintf($regex ['close'], $match[1] ), substr($data , $pos ), $match )) {
$close = $match[0] ;
$value = shorten(substr($data , $i + 1, strpos($data , $close , $i ) - $i - 1), $free , '');
$i = strpos($data , $close , $i ) + strlen($close ) - 1;
$free -= strlen($value );
$short .= $open . $value . $close ;
continue;
}
}
$short .= $data {$i} ;
$free --;
}
return $short . $endString ;
}
$data = '<em>Zoek met <a href=" http: //www.google.nl"><b>Google</b></a>!</em>';
?>
Als het goed is worden zo'n beetje alle html tags ondersteund!
Edit:
PHP-tags vergeten.
Anoniem - 03/07/2007 19:00
PHP gevorderde
@gothmog
Je hebt gelijk, een typefoutje.
Gesponsorde links
Dit onderwerp is gesloten .