[PHP] preg_split zorgt voor spaties

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
Ik heb een input:

title|subject|
title|subject|
title|subject|
title|subject|
title|subject|
enz....

Er zitten geen spaties achter de zinnen, maar wel enters naar de volgende zin.
Deze input staat in een textbox, en de waarde daarvan stop ik in een variabele $input.

Vervolgens doe ik dit:

$arrInput = preg_split('/[|]/', $input);

Wat krijg ik nu als ik de array laat zien mbv deze code:
PHP:
1
2
3
4
for ($i = 0 ; $i < count($arrInput)-1 ; $i+=2) {
   echo $arrInput[$i].'<br>';
   echo $arrInput[$i+1].'<br><br>';
}

Ik krijg dan dit te zien:

title
subject

_title
subject

_title
subject

_title
subject

enz...

Spaties heb ik weergegeven met _ aangezien spaties in een post worden weggehaald.
Let vooral op de spatie voor het woord 'title' NA de eerste 2 elementen van de array.

Die spatie vern*ukt mijn checks die ik uitvoer op de array. Bovendien wil ik weten hoe het komt ??

Als ik de input op deze manier doe gaat het wel goed:
title|subject|title|subject|title|subject|title|subject|title|subject| enz...

Maar dat is geen optie, en bovendien is dat natuurlijk geen oplossing.

[ Voor 13% gewijzigd door verytallman op 21-04-2006 00:34 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:10

crisp

Devver

Pixelated

dat zijn gewoon de newlines die in je input zitten; als je die niet wilt hebben zal je of de regexp voor je split moeten aanpassen dusdanig dat 'ie eventuele newlines mee-matched in de split, of achteraf je array-items moeten trimmen ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
Ja dat klinkt erg voor de hand liggend.

Het beste lijkt me om de regexp aan te passen , dan zal ik opzoek moeten gaan naar uitleg hoe die werken. Tenzij iemand dat hier 1 2 3 weet?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

FAQ's zijn er niet voor niets. ;)

Programming FAQ - Regular expressions

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
Kijk is aan :)

Ik heb het gelezen en kom hierop uit :
PHP:
1
$arrInput = preg_split('/(\|)|(\|[[:space:]])/', $post_bulk_input, -1);

Zou moeten werken, maar niet dus...

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Ehm, omdat je het wel heel erg vreemd aanpakt. :+
PHP:
1
$arrInput = preg_split('/[|\s]+/s', $post_bulk_input, -1);

Doet waarschijnlijk al veel meer. [:space:] is sowieso voor POSIX regexps geloof ik, terwijl preg_split gebruik maakt van PCRE. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:39
PCRE ondersteunt die POSIX syntax ook; daar ligt het niet aan. (Neemt niet weg dat \s een stuk korter is als je tóch al voor PCRE gekozen hebt.)

Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
-NMe- schreef op vrijdag 21 april 2006 @ 01:43:
Ehm, omdat je het wel heel erg vreemd aanpakt. :+
PHP:
1
$arrInput = preg_split('/[|\s]+/s', $post_bulk_input, -1);

Doet waarschijnlijk al veel meer.
Doet het ook niet.

En dit dit het ook niet:
PHP:
1
$arrInput = preg_split('/\||\|(\s+)/', $post_bulk_input, -1);

Misschien dat het probleem moeilijker ligt, Het zijn eigenlijk ook geen spaties maar het is (ook) een enter.

[ Voor 3% gewijzigd door verytallman op 21-04-2006 06:45 ]


Acties:
  • 0 Henk 'm!

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-03 19:44

PrinsEdje80

Holographic, not grated...

Misschien is het heel stom, maar heb je er aan gedacht dat je enter een \r\n zou kunnen zijn ipv een \n ?!?

Used to be Down Under... Foto gallery


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:10

crisp

Devver

Pixelated

Die van NMe doet het prima:
PHP:
1
2
3
4
5
6
7
8
9
$input = 'title|subject|
title|subject|
title|subject|
title|subject|
title|subject|';

$arrInput = preg_split('/[|\s]+/', $input, -1, PREG_SPLIT_NO_EMPTY);

print_r($arrInput);

\s matched alle whitespace karakters, inclusief CR en LF (s-modifier is dus ook niet nodig in dit geval).

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
crisp schreef op vrijdag 21 april 2006 @ 08:33:
Die van NMe doet het prima:
PHP:
1
$arrInput = preg_split('/[|\s]+/', $input, -1, PREG_SPLIT_NO_EMPTY);

\s matched alle whitespace karakters, inclusief CR en LF (s-modifier is dus ook niet nodig in dit geval).
Ik heb de code van NMe letterlijk geprobeerd en bij mij deed hij het niet.

Ik ben niet echt thuis in regexp maar wat ik lees bij deze expressie is dat hij split als hij dit stukje "| " 1 of meerdere keren tegenkomt.

Dit zou beter moeten zijn:
PHP:
1
$arrInput = preg_split('/\|(\s*)/', $input, -1);

Omdat hij nu kijkt naar stukken waar 1 keer een "|" staat en 0 of meerdere keren een spatie.

Ik ben nu alleen op mijn werk dus het kan niet testen.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:10

crisp

Devver

Pixelated

verytallman schreef op vrijdag 21 april 2006 @ 09:31:
[...]

Ik heb de code van NMe letterlijk geprobeerd en bij mij deed hij het niet.

Ik ben niet echt thuis in regexp maar wat ik lees bij deze expressie is dat hij split als hij dit stukje "| " 1 of meerdere keren tegenkomt.

Dit zou beter moeten zijn:
PHP:
1
$arrInput = preg_split('/\|(\s*)/', $input, -1);

Omdat hij nu kijkt naar stukken waar 1 keer een "|" staat en 0 of meerdere keren een spatie.

Ik ben nu alleen op mijn werk dus het kan niet testen.
Dan zo:
PHP:
1
$arrInput = preg_split('/\s*\|\s*/', $input);

maar eea ligt ook een beetje aan wat de bedoeling is, en of iets als foo||bar nu 2 of 3 (de middelste leeg) elementen op moet leveren...

Die van NMe geeft inderdaad wel problemen:
PHP:
1
$input = 'een zinnetje met spaties|geenspaties';

hij split namelijk ook op enkel whitespace ;)

[ Voor 10% gewijzigd door crisp op 21-04-2006 09:40 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • RedBeard
  • Registratie: April 2006
  • Niet online
Zet anders de tekst regels om naar een char-array en print deze waarden naar het scherm. Dan kan je controleren welk karakter er exact inzit.

Ik heb ooit eens een dergelijk probleem gehad en daarbij stond om een onduidelijk reden een speciaal teken (A met een raar accentje) achteraan de tekst, nadat ik het uit een database gehaald had. Dit teken werd echter weergegeven als een spatie

I'm not anti-social, I'm just not user friendly


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
crisp schreef op vrijdag 21 april 2006 @ 09:37:
[...]

Dan zo:
PHP:
1
$arrInput = preg_split('/\s*\|\s*/', $input);
Dat is idd nog iets completer, maar ik ga er niet vanuit dat er spaties staan voor de "|".

Heb je deze code al getest trouwens? Ik zou het zelf willen doen maar zit op me werk.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

verytallman schreef op vrijdag 21 april 2006 @ 10:24:
Dat is idd nog iets completer, maar ik ga er niet vanuit dat er spaties staan voor de "|".
Maakt toch niet uit? Je kan er gewoon rekening mee houden, kost niks en dan zit je straks ook niet raar op te kijken als het per ongeluk toch eens fout gaat. :)
Heb je deze code al getest trouwens? Ik zou het zelf willen doen maar zit op me werk.
crisp is zo goed met regexps, die hoeft niets te testen. :+ En trouwens, je kan toch wachten tot je thuis bent en het dan zelf doen? :)

Mijn regexp hierboven deed het trouwens bij mij ook prima, uitgaande van de data in je topicstart. Uiteraard heb je daar weinig aan als er spaties in de tekst zelf voorkomen, en daar heb ik inderdaad niet bij stilgestaan. :P Maar die regexp van crisp lijkt dat op te lossen.

Trouwens, ik haal uit deze reply dat je nog steeds niet begrijpt wat character classes zijn, dus ik verwijs je graag nog eens een keer naar de regexp-FAQ. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
-NMe- schreef op vrijdag 21 april 2006 @ 14:25:
Trouwens, ik haal uit deze reply dat je nog steeds niet begrijpt wat character classes zijn, dus ik verwijs je graag nog eens een keer naar de regexp-FAQ. ;)
Ik snap niet hoe je tot die redenering komt.
Volgens mij heb ik voor deze regexp geen character classes nodig?
De regexp die ik nu heb werkt toch prima?

[ Voor 6% gewijzigd door verytallman op 21-04-2006 16:21 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Ik zeg niet dat je ze nodig hebt, ik zeg dat je ze niet begrijpt. En dat haal ik uit dit stukje tekst:
verytallman schreef op vrijdag 21 april 2006 @ 09:31:
Ik ben niet echt thuis in regexp maar wat ik lees bij deze expressie is dat hij split als hij dit stukje "| " 1 of meerdere keren tegenkomt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 28-05 23:56
Ja ik heb het nu net geprobeert, die uitleg van mij klopt niet helemaal.

De eerdere regexp die crisp poste heb ik net getest, die werkt :)

Ik ga nog wel een keer die faq doorlezen, alhoewel die niet heel duidelijk vind.
Pagina: 1