Enter toevoegen aan een php waarde

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Piet Knaap

Piet Knaap

10/01/2014 13:36:46
Quote Anchor link
Ik heb een php waarde met een lap tekst hierin (zonder Enters) Als ik de variabele afdruk op het scherm krijg ik de lap tekst netjes onder elkaar te zien op het scherm zonder Enters.

Nu wil ik dat de lap tekst wordt gescheiden na een bepaalde combinatie (punt spatie hoofdletter) met een Enter (break line). Ik heb het geprobeerd met bijvoorbeeld 'substr_count' maar daarmee kan ik niet zoeken op mijn combinatie (punt spatie hoofdletter --> voorbeeld '. Hallo') Weet iemand of het überhaupt mogelijk is?
 
PHP hulp

PHP hulp

24/11/2024 02:56:07
 
Michael -

Michael -

10/01/2014 13:39:24
Quote Anchor link
Volgens mij is str_replace() wat je zoekt. Hiermee kun je je combinatie vervangen door een enter

edit: Afhankelijk van wat je hiermee wil bereiken zou je ook nog explode() kunnen gebruiken.
Gewijzigd op 10/01/2014 13:41:09 door Michael -
 
- SanThe -

- SanThe -

10/01/2014 13:40:49
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$tekst
= str_replace('. ', '.<br/>', $tekst);
?>

Zo heb je na elke punt gevolgd door een spatie een (html) enter.
Gewijzigd op 10/01/2014 13:41:33 door - SanThe -
 
Piet Knaap

Piet Knaap

10/01/2014 13:49:57
Quote Anchor link
Bedankt voor jullie snelle reactie.

met $tekst = str_replace('. ', '.<br/>', $tekst); krijg ik na elke punt-spatie (. ) een enter.

Ik wil pas na een combinatie van 'punt-spatie-hoofdletter' pas een enter.
 
- SanThe -

- SanThe -

10/01/2014 13:53:46
Quote Anchor link
Na een punt komt als het goed is (bijna) nooit een kleine letter.
 
Piet Knaap

Piet Knaap

10/01/2014 14:00:04
Quote Anchor link
Bij (of na) een afkorting krijg je ook een . spatie :)
 
Victor G

Victor G

10/01/2014 14:23:38
Quote Anchor link
Kijk hier eens na
 
Michael -

Michael -

10/01/2014 14:47:57
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$string
= preg_replace('/(\.) ([A-Z])/', '$1<br />$2', $string);
?>
Gewijzigd op 10/01/2014 14:48:34 door Michael -
 
Piet Knaap

Piet Knaap

10/01/2014 14:52:57
Quote Anchor link
Dat werkt inderdaad Michael!
 
Willem vp

Willem vp

10/01/2014 15:34:01
Quote Anchor link
In dit geval is het bij preg_replace overigens 'mooier' (in ieder geval efficiënter) om met lookbehind/lookahead assertions te werken, omdat er anders references worden aangemaakt die eigenlijk alleen gebruikt worden om te voorkomen dat je karakters kwijtraakt. Je krijgt dan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$string
= preg_replace('/(?<=\.)\s+(?=[A-Z])/', '<br />', $string);
?>

(Ik heb ook de spatie in \s+ veranderd, maar dat is niet per se noodzakelijk.)
Gewijzigd op 10/01/2014 15:35:58 door Willem vp
 
Ozzie PHP

Ozzie PHP

10/01/2014 15:56:06
Quote Anchor link
Willem vp op 10/01/2014 15:34:01:
... om met lookbehind/lookahead assertions te werken, omdat er anders references worden aangemaakt die eigenlijk alleen gebruikt worden om te voorkomen dat je karakters kwijtraakt.

Willem, kun je eens toelichten wat je hiermee bedoelt? Ik lees de woorden, maar heb geen flauw ideee wat je zegt :-)
 
Willem vp

Willem vp

10/01/2014 16:20:49
Quote Anchor link
Ozzie, ik zal proberen het iets minder compact te formuleren. ;-)

De reguliere expressie van Michael (die overigens ook gewoon goed is) was als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
(\.) ([A-Z])

Er wordt dus gezocht naar een punt, gevolgd door een spatie, gevolgd door een hoofdletter. Als je dat zou vervangen door een break-tag, ben je de punt en de hoofdletter kwijt, omdat die onderdeel zijn van de match. Om dat te voorkomen heeft hij haakjes geplaatst; hetgeen tussen haakjes staat wordt dan onthouden en daar kun je bij het vervangen weer naar refereren (in dit geval met $1 en $2, omdat er twee sets haakjes geplaatst zijn).

Echter, die punt en hoofdletter zijn eigenlijk geen onderdeel van de find-and-replace-operatie. Het enige wat je wilt vervangen is de spatie die ertussen staat. Wat er hierboven eigenlijk gebeurt is dat je niet alleen de spatie vervangt, maar ook de letters die er omheen staan (en die vervang je dan door zichzelf).

Stel dat je een gele auto hebt. Die wil je groen spuiten, maar alleen als hij geparkeerd staat tussen een rode en een blauwe auto. Als de autospuiter hetzelfde zou doen als de reguliere expressie, zou hij de rode auto rood spuiten, de gele auto groen en vervolgens de blauwe auto blauw. Daar zit het een en ander aan onnodig werk tussen. ;-)

Om de reguliere expressie efficiënter te maken zijn daarom assertions bedacht:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
(?<=\.)\s+(?=[A-Z])

De (?<=\.) is een lookbehind assertion die "waar" is als de te zoeken string \s+ (dus 1 of meerdere whitespace-tekens) direct achter een punt (\.) staat. De (?=[A-Z]) is een lookahead assertion die waar is als \s+ wordt gevolgd door een hoofdletter ([A-Z]). Zowel de punt als de hoofdletter worden echter geen onderdeel van de match.

Als de \s+ niet achter een punt staat, maar bijvoorbeeld achter een letter, zal de lookbehind assertion "onwaar" zijn. Hetzelfde geldt voor de lookahead assertion als de \s+ niet wordt gevolgd door een hoofdletter, maar door bijvoorbeeld een gewone letter. Pas wanneer alle assertions "waar" zijn, zal preg_replace de \s+ vervangen door een break-tag. Omdat de assertions geen onderdeel van de match zijn, worden de punt en de hoofdletter met rust gelaten.
 
Michael -

Michael -

10/01/2014 16:33:06
Quote Anchor link
Willem +1. Snap ik alleen niet waarom er 2 verschillen zijn (voor en achter, of misschien meer) terwijl die moet zoeken in de volgorde zoals jij het er neer zet, maar dat ga ik zelf nog wel eens uitzoeken :)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.