substr() tot na img tag
Ik wil een verkorte versie weergeven van de laatste reactie.
Maar nu omdat ik gebruik maak van ckeditor (dus met smiley's of URL) dan knipt hij de helft van de html tag weg...
Hoe kan ik ervoor zorgen dat de substr alleen werkt voor het aantal characters zonder de HTML tags?
Situatie nu:
Code (php)
Situatie nu resultaat:
Dit is een test <img src="image
Wat ik wil bereiken:
Dit is een test <img src="images/smiley" /> -- waarbij de img tag als 1 character telt.
Alvast bedankt!
Gewijzigd op 06/08/2012 23:28:23 door Dimitri Van Reeth
Klik 1
Klik 2
Klik 3
Denk dat 1 meer is na waar je opzoek bent.
Verder niet echt gekeken nog in de code.
bedankt voor je hulp!
Toevoeging op 07/08/2012 13:15:20:
Ik heb ook de 3de link proberen te gebruiken maar dit werkt ook niet...
Toevoeging op 07/08/2012 13:49:48:
Even om het samen te vatten wat er niet werkt:
De functie zelf:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
/**
* Functie om een string in te korten
*
* Deze funtie kort een string in en houd daarbij rekening met html tags.
* Html tags nemen geen ruimte in in de gereturnde string en ze worden
* ook niet afgebroken als de maximale lengte bereikt is. De lengte van
* de ingekorte string en de string waarmee die beëindigt wordt kan zelf
* worden bepaald.
*
* @author Rik Veenboer
* @param string $data de string die verkort moet worden
* @param int $length de lengte die de string moet krijgen
* @param string $endString de string waarmee de verkorte string beëindigt wordt
* @return string een string met de ingekorte $data
**/
function shorten($data, $length, $endString = '...') {
// De regexes voor de open en close html tags
$regex = array(
'open' => '/^\<[ ]*([a-z]+)[ ]*(?:[a-z]*[ ]*\=[ ]*\"[^\"\'<>]*\")*[ ]*(\/?)[ ]*\>$/',
'close' => '/\<[ ]*\/[ ]*%s+[ ]*\>/s'
);
$short = '';
// De lengte van de nieuwe string is inclusief de puntjes op het einde behalve als de invoer al kort genoeg is
$isShortString = strlen(strip_tags($data)) <= $length;
$length -= $isShortString ? 0 : strlen($endString);
$free = $length;
// Elk teken afgaan totdat ze op zijn of totdat er geen meer nodig zijn
for ($i = 0; $i < strlen($data) && $free > 0; $i++) {
// Controleren of het huidige teken een < is en of er ook nog een > achter staat
if ($data{$i} == '<' && ($pos = strpos($data, '>', $i + 1)) !== false) {
// De open tag in een string zetten
$open = substr($data, $i, ($pos - $i + 1));
// Controleren of de opentag geldig is
if (preg_match($regex['open'], $open, $match)) {
// Tags waarvan geen sluit tag bestaat detecteren
if (isset($match[2]) && $match[2] == '/') {
$short .= $open;
// De pointer voorbij deze tag zetten en verder gaan
$i += strlen($open) - 1;
continue;
}
// Sluittag opzoeken
if (preg_match(sprintf($regex['close'], $match[1]), substr($data, $pos), $match)) {
$close = $match[0];
// De waarde tussen de open en sluit tag vandaan halen en apart parsen
$value = shorten(substr($data, $pos + 1, strpos($data, $close, $pos) - $pos - 1), $free, '');
$free -= strlen($value);
// Het geheel toevoegen aan de verkorte string
$short .= $open . $value . $close;
// Pointer voorbij de sluit tag zetten
$i += strlen($open . $value . $close) - 1;
} else {
// Als er geen geldige sluit tag is gevonden voegen we open tag beveiligd toe
$short .= htmlentities($open, ENT_QUOTES);
$i += strlen($open) - 1;
}
// Ga verder met het volgende teken
continue;
}
}
// Het huidige teken beveiligd toevoegen
$short .= htmlentities($data{$i}, ENT_QUOTES);
$free--;
}
// Alleen puntjes toevoegen als de invoer langer dan de opgegeven lengte is
return $short;
}
?>
/**
* Functie om een string in te korten
*
* Deze funtie kort een string in en houd daarbij rekening met html tags.
* Html tags nemen geen ruimte in in de gereturnde string en ze worden
* ook niet afgebroken als de maximale lengte bereikt is. De lengte van
* de ingekorte string en de string waarmee die beëindigt wordt kan zelf
* worden bepaald.
*
* @author Rik Veenboer
* @param string $data de string die verkort moet worden
* @param int $length de lengte die de string moet krijgen
* @param string $endString de string waarmee de verkorte string beëindigt wordt
* @return string een string met de ingekorte $data
**/
function shorten($data, $length, $endString = '...') {
// De regexes voor de open en close html tags
$regex = array(
'open' => '/^\<[ ]*([a-z]+)[ ]*(?:[a-z]*[ ]*\=[ ]*\"[^\"\'<>]*\")*[ ]*(\/?)[ ]*\>$/',
'close' => '/\<[ ]*\/[ ]*%s+[ ]*\>/s'
);
$short = '';
// De lengte van de nieuwe string is inclusief de puntjes op het einde behalve als de invoer al kort genoeg is
$isShortString = strlen(strip_tags($data)) <= $length;
$length -= $isShortString ? 0 : strlen($endString);
$free = $length;
// Elk teken afgaan totdat ze op zijn of totdat er geen meer nodig zijn
for ($i = 0; $i < strlen($data) && $free > 0; $i++) {
// Controleren of het huidige teken een < is en of er ook nog een > achter staat
if ($data{$i} == '<' && ($pos = strpos($data, '>', $i + 1)) !== false) {
// De open tag in een string zetten
$open = substr($data, $i, ($pos - $i + 1));
// Controleren of de opentag geldig is
if (preg_match($regex['open'], $open, $match)) {
// Tags waarvan geen sluit tag bestaat detecteren
if (isset($match[2]) && $match[2] == '/') {
$short .= $open;
// De pointer voorbij deze tag zetten en verder gaan
$i += strlen($open) - 1;
continue;
}
// Sluittag opzoeken
if (preg_match(sprintf($regex['close'], $match[1]), substr($data, $pos), $match)) {
$close = $match[0];
// De waarde tussen de open en sluit tag vandaan halen en apart parsen
$value = shorten(substr($data, $pos + 1, strpos($data, $close, $pos) - $pos - 1), $free, '');
$free -= strlen($value);
// Het geheel toevoegen aan de verkorte string
$short .= $open . $value . $close;
// Pointer voorbij de sluit tag zetten
$i += strlen($open . $value . $close) - 1;
} else {
// Als er geen geldige sluit tag is gevonden voegen we open tag beveiligd toe
$short .= htmlentities($open, ENT_QUOTES);
$i += strlen($open) - 1;
}
// Ga verder met het volgende teken
continue;
}
}
// Het huidige teken beveiligd toevoegen
$short .= htmlentities($data{$i}, ENT_QUOTES);
$free--;
}
// Alleen puntjes toevoegen als de invoer langer dan de opgegeven lengte is
return $short;
}
?>
Code waarin de functie word aangeroepen:
Code (php)
1
2
3
4
2
3
4
//Shortens comment if it's longer than the maximum allowed characters
if(strlen(strip_tags($comment)) > 100){
$comment = shorten($comment, 100).'...';
}
if(strlen(strip_tags($comment)) > 100){
$comment = shorten($comment, 100).'...';
}
Output:
Code (php)
1
2
3
2
3
<h6><b>Dimitri</b></h6>
<p>We gaan eens testen of dit ook lukt voor strings die langer zijn dan 80 characters. <img alt="smi</p>...
<a href="fullnews.php?newsid=7#comment">Read more</a>
<p>We gaan eens testen of dit ook lukt voor strings die langer zijn dan 80 characters. <img alt="smi</p>...
<a href="fullnews.php?newsid=7#comment">Read more</a>
Gewijzigd op 07/08/2012 14:01:09 door Dimitri Van Reeth