Hi,

Ik heb in m'n database een lap tekst, welke begint met een plaatsaanduiding (zijn nieuwsartikelen) a la 'PLAATSNAAM -'. Nu wil ik dat die plaatsnaam een bepaalde stijl heeft. Via CSS is het me niet gelukt en kon ik online ook niets vinden.

Daarom had ik het volgende:

	                <?php
		                $content = $article['content'];
		                $arr = explode(' ',trim($content));
						echo '<strong style="color: #e9443c;">'.$arr[0].'</strong> '; // will print Test
						
						$words = explode( ' ', $content);
						array_shift( $words);
						$content = implode( ' ', $words);
						
		                echo $content;
			    ?>


Echter gaat dat in sommige gevallen mis. Sommige artikelen hebben geen plaatsaanduiding, of hebben een plaatsaanduiding waarvan de plaats uit twee 'woorden bestaat' (DE PLAATS -). Ik heb echter geen idee hoe ik dat moet opvangen.. De syntax is wel vast 'PLAATSNAAM - '.
Dat kan bijvoorbeeld door de string te splitsen op het eerste streepje met spaties.

<?php
$content = explode(' - ', $content, 2);
?>

Hierna bevat $content[0] de plaatsnaam en $content[1] de rest van het bericht.
Deze kun je vervolgens recombineren met extra CSS, bijvoorbeeld:

<?php
$content = explode(' - ', $content, 2);
$content = '<span class="plaatsnaam">' . $content[0] . '<span> - ' . $content[1];
?>

Ward van der Put op 24/01/2017 15:15:39

en $content[1] de rest van het bericht.


Uiteraard alleen als er niet nog een - in voorkomt.
- SanThe - op 24/01/2017 15:20:59

Uiteraard alleen als er niet nog een - in voorkomt.


Inderdaad.. ik had ook al gedacht aan een selectie op het streepje, maar dan loop ik hier tegenaan...
Jelle Hi op 24/01/2017 15:30:04

[quote="- SanThe - op 24/01/2017 15:20:59"]
Uiteraard alleen als er niet nog een - in voorkomt.


Inderdaad.. ik had ook al gedacht aan een selectie op het streepje, maar dan loop ik hier tegenaan...

[/quote]
Nee hoor, daarom heb ik (a) de derde parameter $limit van explode() op 2 gezet, zodat je maar 2 array-elementen krijgt, en (b) de string gesplitst op ' - ' in plaats van '-', zodat plaatsnamen met een - worden genegeerd. Uiteraard kan er dan altijd nog een uitzonderingsgeval optreden, maar daarvoor kun je dan nog een nette exception inbouwen.
Ward van der Put op 24/01/2017 15:52:31

... daarom heb ik (a) de derde parameter $limit van explode() op 2 gezet, zodat je maar 2 array-elementen krijgt ...


Niet opgemerkt, maar inderdaad een goede oplossing.
Dit werkt met en zonder streepje. Het test op hoofdletters. Uitzonderingen controleren zoals plaatsnamen met 's- moeten worden toegevoegd.

[code]<?php

$tekst = 'CURABITUR RISUS DER - Blandit tempus porttitor.';

echo '<p>' . $tekst . '</p>' . PHP_EOL;

$content = explode(' ', $tekst, 4);

echo '<pre>';

print_r( $content );

echo '</pre>';

for ( $i = 0 ; $i < count( $content ) ; $i++ ) {
if ( $content[$i] == ctype_upper( $content[$i] ) ) {
$content[$i] = '<span style="color : red;">' . $content[$i] . '</span>';
echo '<p style="color : red;">' . $content[$i] . '</p>';
}
}

echo '<p>';

for ( $i = 0 ; $i < count( $content ) ; $i++ ) {
echo $content[$i] . ' ';
}

echo '</p>';
?>[code]
Ik zou aan een regex denken
(ongetest):

<?php

$tekst  = "'S-HERTOGEN DEN BOSCH - Blandit tempus porttitor.";

if(preg_match('#^(?P<plaats>[A-Z\' -]+) - (?P<tekst>.*)#', $tekst, $aMatches)) {
   
   echo '<span class="first">'.htmlspecialchars($aMatches['plaats']) . '</span>';
   echo htmlspecialchars($aMatches['tekst']);
}
else {
  echo htmlspecialchars($tekst);
}

?>


[size=xsmall]Toevoeging op 24/01/2017 17:51:40:[/size]

uitleg van de regex:

^ vanaf het begin van de string in $tekst

(?P<xxxxx>) sla het resultaat op in $aMatches['xxxxx']

[A-Z\' -]: een serie karakters om uit te kiezen: hoofdletters A tm Z (A-Z)
: een ', een spatie en een koppel teken

+ : daarvan zoeken we 1 of meer tekens

- : Daarachter moet een spatie, koppelteken spatie komen

(?P<tekst>.*) alle tekens die daarna nog komen opslaan in $aMatches['tekst']
Hier een lijst met plaatsnamen :

https://home.kpn.nl/pagklein/almanak.html

Met dit kan je zo'n beetje alles er uit krijgen :

't GEULLE Almere-Stad 's-Hertogenbosch BLaNDIT tempus porttitor.

for ( $i = 0 ; $i < count( $content ) ; $i++ ) {
	if ( $content[$i] == "'t" || ( strpos( $content[$i] , "s-" ) == TRUE ) || ( strpos( $content[$i] , "-" ) == TRUE ) ) {
		$content[$i] = '<span style="color : red;">' . $content[$i] . '</span>';
		echo '<p style="color : red;">' . $content[$i] . '</p>';
	} elseif ( $content[$i] == ctype_upper( $content[$i] ) ) {
		$content[$i] = '<span style="color : red;">' . $content[$i] . '</span>';
		echo '<p style="color : red;">' . $content[$i] . '</p>';
	}

echo '<p>';

for ( $i = 0 ; $i < count( $content ) ; $i++ ) {
	echo $content[$i] . ' ';
}
echo '</p>';

}

Reageren