Ik probeer een Regular expression te maken, er moet namelijk een split worden uitgevoerd bij een &-teken maar alleen als daarop volgend niet nog een &-teken staat.

Dus String: 1&2&3&hoi&&jaja
moet dit worden 1,2,3,hoi&&jaja

Alvast bedankt.
Werkt dit niet?

<?
$aWaarden = preg_split("/[^&]&[^&]/", $string);
?>
Dat was mijn idee ook in eerste instantie, maar het wil niet werken ik krijg namelijk: ,&,oi&&jaja
Met ^ en & kun je toch het begin en einde van de gezochte string opgeven?
^ is het begin in $ het eind.. & is geen metacharacter (heeft geen andere betekenis)
Miloan schreef op 23.08.2007 12:04
^ is het begin in $ het eind.. & is geen metacharacter (heeft geen andere betekenis)


Klopt maar dat heeft in mijn geval geen enkel nut.
Verrek! Je hebt gelijk, was nog niet helemaal wakker...
Hmm..
misschien met [php]preg_split[/php] gewoon op &-characters splitten en daarna de arrays langslopen op regelnummers die opeenvolgen:
<?php
// misschien zoiets
$string = '1&2&3&hoi&&jaja';
$array = preg_split('/&/', $string);
$string2 = '';
foreach ($array as $key => $value) {
$string2 .= substr($string, $array[($key-1)], $value[1]-1);
if ($array[($key-1)][1] != $value[1]-1 && $array[($key+1)][1] != $value[1]+1) {
$string2 .= ',';
}
}
echo $string2;
?>

Dit script is niet getest en is dus op eigen risico!

Ik denk niet dat 't script werkt, maar het idee erachter wel..
Met ^ en & kun je toch het begin en einde van de gezochte string opgeven?


Nee, met ^ aan het begin van een regex geef je het begin van de string aan, en met $ het einde. ^ in een character class context is een negate teken (alles behalve..).

Excuus voor de vorige oplossing. [^&] Matched alles behalve het & teken, terwijl het helemaal niets moet matchen. De oplossing was het gebruik van look-ahead en look-behind negative assertions:

Getest en het werkt:
<?
$string = "1&2&3&hoi&&jaja";
$aWaarden = preg_split("/(?<!&)&(?!&)/", $string);
print_r($aWaarden);
?>
Dank je, het werkt.

Reageren