Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Vypsání části článku - problém - php

Zdarec. Mám uložené články v DB, které mají třeba i tisíce znaků. Tyto články obsahují klasické html tagy, protože se články vytváří pomocí WYSIWYG CKEditor.

Chci ovšem vypsat z např. 12 000 znaků jen 1000. Jak to mám ale udělat tak, aby se mi to nezastavilo třeba u

<img src="obra

? Nebo jak to mám obecně udělat?

Takto vypadá můj skript, který mi ovšem nefunguje:

<?php 
	function html_cut($text, $limit) {
		$lenght = 0;
		$tags = array();
		for ($i = 0; $i < strlen($text) && $i < $limit; $i++) { 
			switch ($text[$i]) {

				case '<':
					$start = $i+1;
					while ($i < strlen($text) && $text[$i] != '>' && !ctype_space($text[$i])) {
						$i++;
					}
					$tag = substr($text, $start, $i-$start);

					$in_quote = '"';
					while ($i < strlen($text) && ($in_quote != '>' || $text[$i] != '>')) { #VŠE SE VYKONÁ ZDE
						if (($text[$i] == '"' || $text[$i] == "'") && !$in_quote) {
							$in_quote = $text[$i];
						}
						elseif ($in_quote == $text[$i]) {
							$in_quote = '"';
						}
						$i++; # když tu dám echo $i, tak se vypíšou všechna čísla 1 - počet znaků
					}
					if ($text[$start] == '/') {
						array_shift($tags);
					}
					elseif ($text[$i-1] != '/') {
						array_unshift($tags, $tag);
					}
					break;
				
				case '&':
					$lenght++;
					while ($i < strlen($text) && $text[$i] != ';') {
						$i++;
					}
					break;
				default:
					while ($i + 1 < strlen($text) && ord($text[$i+1]) > 127 && ord($text[$i+1]) < 192) {
						$i++;
					}
			}
		}
		$text = substr($text, 0, $i);
		if ($tags) {
			$text .= "</".implode("></", $tags).">";
		}
		return $text;
	} #řádek 50
?>

a další odkazující se:

$limit = 150;
							include "include/scripts/html_cut.php";
							$a = html_cut($text, $limit);
							echo $a;

PROBLÉMY:
- Vypisuje mi to chybu: Fatal error: Cannot redeclare html_cut() (previously declared in C:\xampp\htdocs\esport\include\scripts\html_cut.ph p:2) in C:\xampp\htdocs\esport\include\scripts\html_cut.ph p on line 50
- Nefunguje mi limit. Když dám limit třeba 50, i tak to přejde celý řetězec a u 50 znaků se nezastaví.

Po vykonání funkce má $i maximální hodnotu (tedy délka řetězce ve znacích + 1).
$lenght má hodnotu 0.
Vše se vykoná v cyklu while. (označen poznámkou), proč?
___________________

Jinak mě ještě napadlo, že by to šlo udělat normálně, že bych do sekce, kde se přidávají články, přidal ještě další textové pole, které by sloužilo pouze na psaní těchto krátkých ukázek, které by se tam poté vložily.

Za veškeré rady děkuji. A i kdybyste neměli řešení, tak bych rád aspoň zjistil, proč to nefunguje tak, jak chci. Děkuji

Předmět Autor Datum
Kľudne pridaj to ďalšie pole. Ono sa to tak dokonca bežne robí, volajú to perex.
čitateľ 12.06.2016 09:56
čitateľ
A k tomu kódu, zdá sa to nezmyselne komplikované. Ja by som použil primitívny algoritmus. Za tými 10…
čitateľ 12.06.2016 10:00
čitateľ
Alebo este lepšie, zbaviť vstup všetkých tagov a ponechať len čistý text, a ten ustrihnúť.. však v p…
čitateľ 12.06.2016 10:04
čitateľ
OK. Pravděpodobně to udělám přidáním dalšího pole. Jinak ten skript měl dělat to, že si ukládat do…
Vilak 12.06.2016 10:32
Vilak
Sú v tom krátkom náhľade dôležité html tagy? Ak nie, tak celý tvoj skript môžeš nahradiť funkciou st…
čitateľ 12.06.2016 10:50
čitateľ
To mi došlo, ale kdyby tam byla třeba taková tabulka, tak by ten text moc smysl tedy nedával... Kon…
Vilak 12.06.2016 11:29
Vilak
Mám tu pak problém s odkazem. Proč mi to nejde? if (strlen($perex) > 600) { $perex = substr($perex,…
Vilak 12.06.2016 12:17
Vilak
to echo predtym ti nieco vypise? poslední
čitateľ 12.06.2016 12:57
čitateľ

Mám tu pak problém s odkazem. Proč mi to nejde?

if (strlen($perex) > 600) {
								$perex = substr($perex, 0, 600);
								$headline_url = rawurlencode($headline);
								echo $headline_url;
								$perex .= "... <a href=\"?article=".$headline_url."_".$id."\">Zobrazit více.</a>";
							}

headline_url je zakódovaná jako url, ale v odkazu se tak neděje, proč?

Zpět do poradny Odpovědět na původní otázku Nahoru