Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Spacje/nowe linijki.
Forum PHP.pl > Forum > Przedszkole
dk1342
Witam próbuje napisać konwenter, użyłem preg_match_all

kod:
  1. <?php
  2. $file = file_get_contents('drift.map');
  3. $znajdz = '/<spawnpoint name="spawnpoint"><position>(.*)</position><rotation>(.*)</rotation><vehicle>(.*)</vehicle></spawnpoint>/';
  4. preg_match_all($znajdz, $file, $pojazdy);
  5. print_r($pojazdy);
  6. ?>


jak widać szuka w pliku drift.map, wszystko ładnie działa gdy w pliku drift.map jest przykładowo takie coś:
Kod
<spawnpoint name="spawnpoint"><position>-317.776550 1516.267578 75.017334</position><rotation>360</rotation><vehicle>522</vehicle></spawnpoint>

(czyli wszystko w jednej linijce)

ale konwenter będzie "dla graczy" więc nie wiem jaki bedzie układ może być np. taki (czyli odstępy, spacje, nowe linijki itp):
Kod
     <spawnpoint name="spawnpoint">
        <position>-317.776550 1516.267578 75.017334</position>
        <rotation>360</rotation>
       <vehicle>522</vehicle>
       </spawnpoint>

to już nie działa więc jak zrobić żeby działało nie zależnie od układu/spacji/enteru
1010
Możesz usunąć wszystkie spacje ze zmiennej
  1. <?
  2. $file = str_replace(' ', '', $file);
  3. ?>
wookieb
Dodajesz modyfikator s
http://pl.php.net/manual/pl/reference.pcre...n.modifiers.php
Musisz jeszcze uwzględnić te spacje w wyrazeniu
Kod
\s*



Lecz nie jest to dobra metoda. Lepiej parsować coś takiego parserem xml http://pl.php.net/simple_xml_load_string

Poza tym twoje wyrażenie regularne nie sprawdzi się przy większej ilości takich <spawnpoint> a to dlatego, że brakuje ci ? po każdej *
dk1342
1010 nie działa, nie znajduje

wookieb zaraz sprawdze
1010
Cytat(dk1342 @ 9.04.2009, 15:42:07 ) *
1010 nie działa, nie znajduje

Czego nie znajduje?
dk1342
wookieb teraz wygląda to tak:

  1. <?php
  2. $znajdz = '/<spawnpoint name="spawnpoint">s<position>(.*)</position>s<rotation>(.*)</rotation>s<vehicle>(.*)</vehicle>s</spawnpoint>/';
  3. preg_match_all($znajdz, $file, $pojazdy);
  4. ?>


w pliku np. tak:

Kod
<spawnpoint name="spawnpoint">
    <position>-317.776550 1516.267578 75.017334</position>
    <rotation>360</rotation>
    <vehicle>522</vehicle>
  </spawnpoint>

i nie znajduje

// juz wiem trzeba s+ nie widziałem twojego edita

______________________________________________________________________________


nie będę zakładać nowego tematu więc napisze tu a nawet to jest troche związane z tym otóż wszystko ładnie działa mam to w tablicy print_r($pojazdy); :

Kod
Array
(
    [0] => Array
        (
            [0] => <spawnpoint name="spawnpoint">
    <position>-317.776550 1516.267578 75.017334</position>
    <rotation>360</rotation>
    <vehicle>522</vehicle>
  </spawnpoint>
            [1] => <spawnpoint name="spawnpoint (1)">
    <position>-417.176550 2516.567578 45.317434</position>
    <rotation>180</rotation>
    <vehicle>813</vehicle>
  </spawnpoint>
        )

    [1] => Array
        (
            [0] =>
            [1] =>  (1)
        )

    [2] => Array
        (
            [0] => -317.776550 1516.267578 75.017334
            [1] => -417.176550 2516.567578 45.317434
        )

    [3] => Array
        (
            [0] => 360
            [1] => 180
        )

    [4] => Array
        (
            [0] => 522
            [1] => 813
        )

)

I nie wiem jaki ułozyć warunek pętli żebym mógł wyświetlić wszystkie wyciągnięte pojazdy w taki sposób
  1. <?php
  2. echo "<textarea>";
  3. // tu pętla w której nie wiem jaki dać warunek
  4. echo " Id obiektu: $id, pozycja $pozycja rotacja $rotacja \n";
  5. // klamra zamykająca pętle
  6. echo "</textarea>";
  7. ?>


i wyświetliło by to:

Kod
Id obiektu: 512, pozycja -317.776550 1516.267578 75.017334, rotacja 380
Id obiektu: 813, pozycja -417.176550 2516.567578 45.317434, rotacja 180

próbowałem to zrobić tak:
  1. <?php
  2. echo "<textarea>";
  3. foreach($pojazdy as $q){
  4. $id = $pojazdy[4][$q];
  5. $pozycja = $pojazdy[2][$q];
  6. $rotacja = $pojazdy[3][$q];
  7. echo " Id obiektu: $id, pozycja $pozycja rotacja $rotacja \n";
  8. }
  9. echo "</textarea>";
  10. ?>

ale jakoś nie wychodziło "Warning: Illegal offset type in"
wookieb
Dodaj jako 4 parametr funkcji preg_match_all, PREG_SET_ORDER
i zobacz sobie tablice wynikową.
dk1342
dodałem to do preg_match_all i zmiejszyła się ilość tych warningów do trzech i teraz w textarei mam takie coś:

Kod
<b>Warning</b>:  Illegal offset type in <b>c:\usr\apache\httpd\html\konwenter.php</b> on line <b>12</b><br />
Id obiektu: , pozycja  rotacja  
<br />
<b>Warning</b>:  Illegal offset type in <b>c:\usr\apache\httpd\html\konwenter.php</b> on line <b>12</b><br />
Id obiektu: , pozycja  rotacja

i tak jak by pętla zadziałało bo mam dwa pojazdy i wyświetliło dwa razy warninga i zdanie id obiektu, pozycja i rotacja ale co oznacza ten warning i jak to naprawić ?
wookieb
A czy ja napisałem, żebyś zostawił pętle tak jak była? nie. Powiedziałem, żeby przejrzał sobie tablicę wynikową.
łatwiej ci bedzie ją ziterować i wyświetlić to co chcesz.
dk1342
ok wyświetliłem sobie znowu tą tablice printem i widze że się całkiem zmieniła teraz w pierwszym nawiasie jest numer wyciągniętego pojazdy a w drugiej to co wyciągneło czyli np. pozycja itp. więc zmieniłem tylko tylko zmienne $id $pozycja $rotacja na

$id = $pojazdy[$q][4];
$pozycja = $pojazdy[$q][2];
$rotacja = $pojazdy[$q][3];

i znów ilość tych samych warningów wzrosła

już sam nie wiem jak ta pętla będzie wyglądać

// dzięki, tak nie wpadłem na to, dopiero zaczynam łapać pętelki i już coraz bardziej je rozumiem, może w końcu je zrozumie
wookieb
Widzę,że nie wiesz jak działa foreach...
A wystarczyło przejrzeć zmienną $q i miałbys odpowiedź.
  1. <?php
  2. $id=$q[4];
  3. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.