Archief - PHP: genereren van previewtekst

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Dece

Legacy Member
ellow,

ik heb hier net een functie geschreven om nieuws items te previewen.
De bedoeling was om niet midden in een zin te stoppen, maar netjes op het einde van een zin.
De functie werkt, maar ik vind ze iets te lang/te zwaar uitgevallen.
mn vraag is dus logischerwijs of ze korter gemaakt kan worden.

PHP:
<?php
$config->preview_chars = 250;
$vb_tekst = 'simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!!simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!! simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!! simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!! simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!! simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!! simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!! ';

function generate_preview($text)
{
	global $config;
	//inkorten van de content string als het moet...
	if (strlen($text) > $config->preview_chars) 
	{
		$temp_content = substr($text, 0, $config->preview_chars);
				
		//nu zitten we prolly in het midden van een zin/woord --> mag niet dus even controleren
		$laatste_letter_temp_content = substr($temp_content, $config->preview_chars, 1);
			
		if ( $laatste_letter_temp_content == '.' ||  $laatste_letter_temp_content == '!' || $laatste_letter_temp_content == '?') 
		{
			//zin is af --> ok
			$preview_text = $temp_content;
		}
		else 
		{
			$remaining_content = substr($text, $config->preview_chars, strlen($text));
					
			//opsporen van de eerste keer dat een van de leestekens voorkomt
			$eerst_voorkomend_punt = strpos($remaining_content, '.');
			$eerst_voorkomend_uitroepteken = strpos($remaining_content, '!');
			$eerst_voorkomend_vraagteken = strpos($remaining_content, '?');
					
			//strpos kan false als resultaat weergeven --> wegfilteren met een immens groot getal
			$eerst_voorkomend_punt = ( !is_integer( $eerst_voorkomend_punt ) ) ? 999999999999 : $eerst_voorkomend_punt;
			$eerst_voorkomend_uitroepteken = ( !is_integer( $eerst_voorkomend_uitroepteken ) ) ? 999999999999 : $eerst_voorkomend_uitroepteken;
			$eerst_voorkomend_vraagteken = ( !is_integer( $eerst_voorkomend_vraagteken ) ) ? 999999999999 : $eerst_voorkomend_vraagteken;
							
			//wat is nu het kleinste?
			if (($eerst_voorkomend_punt < $eerst_voorkomend_uitroepteken) && $eerst_voorkomend_punt < $eerst_voorkomend_vraagteken) 
			{
				//inkorten tot het eerste punt en 2 extra puntjes toevoegen
				$extra_content = substr($remaining_content, 0, $eerst_voorkomend_punt+1).'..';
			}
			elseif (($eerst_voorkomend_uitroepteken < $eerst_voorkomend_punt) && ($eerst_voorkomend_uitroepteken < $eerst_voorkomend_vraagteken))
			{
				$extra_content = substr($remaining_content, 0, $eerst_voorkomend_uitroepteken+1).' ...';
			}
			elseif (($eerst_voorkomend_vraagteken < $eerst_voorkomend_punt) && ($eerst_voorkomend_vraagteken < $eerst_voorkomend_uitroepteken))
			{
				$extra_content = substr($remaining_content, 0, $eerst_voorkomend_vraagteken+1).' ...';
			}
			else 
			{
				//eugh hoe kan da? nuja voor alle veiligheid
				$extra_content = '';
			}
			$preview_text = $temp_content . $extra_content;
		}//einde leestekens
			
		return $preview_text;
	}//einde tekst te lang
		
	else 
	{
		return $text;
	}
		
}//function preview_text

echo preview_text($vb_tekst);
?>

output:
simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!!simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij!!! simpelen test of alles goe marcheert. en om daar zeker van te zijn vul ik dit veld me veel zeverderij! ...

BTW: wie deze code wilt gebruiken mag dat natuurlijk doen :)

WHiSPy

Legacy Member
Maak er een class van en werk het uit naar meerdere functions. Dat is meestal ook wel een manier om uw code kleiner te maken. (ge kunt bepaalde waarden die ge gebruikt bv als constante zetten, etc etc)

Nuja, sinds ik enkel nog java doe, denk ik alles in termen van classes. Als het een beetje te ingewikkeld is, dan wil ik het ook wel eens bekijken, hoor. :)

DarkBone

Legacy Member
Denk er ook aan dat als je een soort BBcode gebruikt in je nieuwsberichten, dat je daar ook rekening mee moet houden!

0n3Liner

Legacy Member
Ga deze functie hoogstwaarschijnlijk gebruiken, misschien wat aanpassen enzo, zal er wel de nodige credits bijzetten ;)

Dece

Legacy Member
kheb een in mijn ogen iets dynamisere manier gevonden om alles in te lezen + een properen manier

hier is ze
PHP:
<?php
class voorstuk 
{
	var $leestekens = array('.' => 'punt',
							'!' => 'uitroepteken',
							'?' => 'vraagteken',
							',' => 'komma');
	
	//eventueel extra functies die ge dervoor wilt
	function generate($text)
	{
		global $config;
		//inkorten van de content string als het moet...
		if (strlen($text) > $config->preview_chars) 
		{
			$temp_content = substr($text, 0, $config->preview_chars);

			//nu zitten we prolly in het midden van een zin/woord --> mag niet dus even controleren
			$laatste_letter_temp_content = substr($temp_content, $config->preview_chars, 1);
			$ongeordende_keys = array_keys($this->leestekens);
								
			if ( $this->scan_laatste_letter($laatste_letter_temp_content, $ongeordende_keys))
			{
				//zin is af --> ok
				$preview_text = $temp_content;
			}
			else 
			{
				$remaining_content = substr($text, $config->preview_chars, strlen($text));
								
				unset ($leesteken);
				unset($i);
				$i=0;
				$sub_array = array();
					
				foreach ($this->leestekens as $leesteken)
				{
					$sleutel = $ongeordende_keys[$i];
					$sub_array[$leesteken] = $this->get_strpos($remaining_content, $sleutel);
					$i++;
				}
				
				//sorteren van de array met behoud van de keys
				asort($sub_array, SORT_NUMERIC);
				$geordende_keys = array_keys($sub_array);
				
				$laagste_sleutel = $geordende_keys[0];
				$laagste_waarde = $sub_array[$laagste_sleutel];
				
				//achtervoegsel netjes houden				
				$achtervoegsel = ( $laagste_sleutel == '.' ) ? '..' : '...';
				
				$extra_content = substr($remaining_content, 0, $laagste_waarde) . $achtervoegsel;
				
				$preview_text = $temp_content . $extra_content;
		
			}//einde leestekens
			
			return $preview_text;
		}//einde tekst te lang
		
		else 
		{
			return $text;
		}
		
	}//function preview_text
	
	function get_strpos($text, $search)
	{
		$pos = strpos($text, $search);
		
		//vervangen van false met hoge waarde
		return  ( !is_integer( $pos ) ) ? 10000000000 : $pos;
	
	}
	function scan_laatste_letter($letter, $leesteken_arr)
	{
		foreach ($leesteken_arr as $leesteken)
		{
			if ($leesteken == $letter)
			{
				//stoppen met scannen, tis in orde
				return true;
			}
		}
		return false;
	}
		
}
?>

oproepen doe je via
PHP:
<?php
$preview = new voostuk();
$preview->generate($string_to_preview);
?>

@whispy: dat stak al in een class hoor. ik poste enkel deze functie omdat de rest van de code hier eigelijk geen zaken mee had ;)

@DB: yep, de bbcode wordt pas na het genereren van de preview gedaan.

@On3liner: ga u gang :)

nog opmerkingen/suggesties --> ga u gang
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan