Dobrze napisałem coś inaczej troszkę niż proponowałeś. Tzn to tak jak by pierwszy poziom obrabiania całości ale mam pewien problem z parametryzacją i przekazywaniem odpowiednich wartości.
Spłodziłem takie coś.
te zmienne na początku nie są istotne dodawałem je w momencie kiedy kombinowałem, żeby mi błędów o braku zdefiniowanej wartości zmiennej nie wywalało.
$tekst = 'pierwszy string { drugi string|trzeci string {czwarty string|piąty string}} |szósty string {{ósmy string| dziewiąty string} dziesiąty string} {jedenasty string| dwunasty string} trzynasty string';
$separator ='|';
$mam=0;
$pStart=0;
$aTablica =0;
$b=0;
$a=0;
$fragment = $tekst;
function licz($fragment, $znak)
{ $b=0;
$c=0;
for ($a=0; $a < strlen( $fragment ); $a++) {
if ( $fragment[$a] == $znak[0] )
{
$pZnak['{'][$b]=$a;
$b++;
}
if ( $fragment[$a] == $znak[1] )
{
$pZnak['}'][$c]=$a;
$c++;
}
}
return $pZnak;
}
$zmienna = licz($fragment, $znak);
$pStart=0; //pozycja startowa do wyszykiwania
if ($tekst[$i] != $znak[0]){ //sprawdzam czy $tekst[$i] jest różny {
$pSeparator = stripos($tekst, $znak[0], $off); // sprawdzam pozycję najbliższego znaku {
$fragment = substr($tekst, $pStart, $pSeparator); // pobieram fragment stringa do znaku { $tablica[$aTablica]= trim($fragment); // dodaje do tablicy fragment stringa $aTablica++;
$i=$pSeparator; // przestawiam $i na pozcyję gdzie skończyłem przeszukiwania dla pętli
$off = $pSeparator; // offset przestawiam na pozycje gdzie skończyłem przeszukiwanie dla funkcji stripos
$pStart=$pSeparator; // pozycja startowa do przeszukiwania stringu
//break;
}
elseif($tekst[$i] == $znak[0]){ //sprawdzam czy $tekst[$i] to znak {
$fragment = substr($tekst, $pStart, strlen( $tekst )); //pobieram string od ostatniego sprawdzenia $pStart do końca $pzZnak = licz($fragment, $znak); // sprawdzaj pozycję wszystkich znaków { }
while($d < count($pzZnak['{'])){ //dopsowuje zamkniecie do otwartych nawiasów if ( $pzZnak['{'][$d]>$pzZnak['}'][$d-1]){ // jeżeli pozycja znaku { jest większa od poprzedniej pozycji znaku } oznacza, że nawiazy pasują do siebie
$pZamkniecie=$pzZnak['}'][$d-1]; // pobieram pozycję znaku } pasującego do {
$d=count($pzZnak['{']); // wyłączam pętle }
$d++;
}
$fragment = substr($fragment, 1
, $pZamkniecie-1
); //pobieram fragment tekstu gdzie ilość znaków { równa się ilości znaków } i wywalam brzegowe {} $tablica[$aTablica]= trim($fragment); // dodaje do tablicy $aTablica++;
$i=$i+$pZamkniecie+1; // przestawiam $i na pozcyję gdzie skończyłem przeszukiwania dla pętli
$off = $i+$pZamkniecie; // offset przestawiam na pozycje gdzie skończyłem przeszukiwanie dla funkcji stripos
$pStart = $pStart+$pZamkniecie+1; // pozycja startowa do przeszukiwania stringu
//break;
}
}
I powiedzmy działa to "prawie dobrze" bo: efekt jest taki:
Kod
Array
(
[0] => pierwszy string
[1] => drugi string|trzeci string {czwarty string|piąty string}
[2] => |szósty string {{ósmy string| dziewiąty string} dziesiąty string} {jedenasty string| dwunasty string} trzynasty string
[3] => jedenasty string| dwunasty string} trzynasty string
)
Problem polega na tym, że już w 3 rekordzie skrypt się gubi czyli $pStart i $off źle przekazują parametry. kombinowałem już na różne sposoby ale wydaje mi się że błąd leży w konstrukcji całości. Później będę to przebudowywał, żeby rozkładał cały ciąg do końca a nie tylko pierwszy poziom ale na początku muszę opanować pierwszy poziom. Co do użycia Case to będę miał konkretne fragmenty to pewnie użyje tej pętli.