Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Rozbijanie tekstu po linii
Forum PHP.pl > Forum > Przedszkole
-Damian-
Cześć. Jaką funkcję mogę wykorzystać aby rozbić tekst, chodzi mi o coś takiego:

Mam załóżmy:
CODE
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD
ASD-ASD-ASD-ASD-ASD-ASD


Chodzi o to, żeby z każdej lini wyciągnać te
CODE
ASD-ASD-ASD-ASD-ASD-ASD
i osobno każde dodać do bazy.
-Damian-
Dobra, napisałem coś takiego:

  1. <?php
  2. if(isset($_POST['submit']))
  3. {
  4. @mysql_connect("localhost", "root", "");
  5. @mysql_select_db("test");
  6. $dane = $_POST['asd'];
  7. $ex = explode("\n", $dane);
  8. foreach ($ex as $key=>$value)
  9. {
  10. mysql_query("INSERT INTO `klucze` (`klucz`) VALUES (".$value.")");
  11. echo "Klucz: ".$value." został dodany do bazy danych.<br />";
  12. }
  13.  
  14. }
  15. ?>
  16. <html>
  17. <form action="test.php" method="post">
  18. <textarea rows="20" cols="100" class="auto" name="asd"></textarea>
  19. <input type="submit" name="submit" value="dalej" />
  20. </form>
  21. </html>


I teraz problem polega na tym, że po dodaniu wszystko ładnie wyświetla się, osobno klucze w każdej lini, ale do bazy mi się dodaje tylko: "-10702
", dałem pole typu TEXT. Dodanie z poziomu phpmyadmin działa bezproblemowo..
SmokAnalog
Pominąłeś apostrofy w zapytaniu. Powinno być:
  1. mysql_query('INSERT INTO `klucze` (`klucz`) VALUES (\'' . mysql_real_escape_string($value) . '\')');

Pozwoliłem sobie na małe posprzątanie Twojego kodu.

I mała rada: nie używaj "\n", tylko PHP_EOL. Znak nowej linii różni się między różnymi systemami.
Gość
Ok, dziękuję, działa.
Teraz pytanko jak pozbyć się pustych linii, bo mam np:
Cytat
K9B98-CD833-45896-98569-8D45F
K9B98-CD833-45896-98569-8D45F

K9B98-CD833-45896-98569-8D45F
K9B98-CD833-45896-98569-8D45F



i pustą linie też dodaje do bazy.
mch.frnc
zastosuj trim() na
  1. $dane
-Damian-
Dalej to samo
lobopol
  1. preg_match_all('/^.+$/im', $tutajzawartoscdoprzeparsowania, $result);
  2. print_r($result);
-Damian-
Dałem tak:

  1. $dane = preg_match_all('/^.+$/im', $_POST['asd'], $dane);


i dalej nic biggrin.gif
lobopol
zrób to co ja i zobacz wynik podmień sobie tylko zmienną
-Damian-
Jest ok:

Cytat
Array ( [0] => Array ( [0] => K9B98-CD833-45896-98569-8D45F [1] => K9B98-CD833-45896-98569-8D45F [2] => [3] => K9B98-CD833-45896-98569-8D45F [4] => K9B98-CD833-45896-98569-8D45F ) )


Teraz jak to połączyć z explode, bo daję:

  1. $ex = explode(PHP_EOL, $result)


to wywala błąd:

Cytat
Warning: explode() expects parameter 2 to be string, array given
-Damian-
Nie, wybaczcie - nie jest dobrze. Dam przykładowo:

Cytat
asd1









asd2


to wyglada to tak:

Cytat
Array ( [0] => Array ( [0] => asd1 [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => [10] => asd2 ) )
lobopol
a na diabła ci explode, masz tablicę wynikową przecież ją sobie przeiteruj. w zasadzie pregmatch powinien wyglądać tak:
  1. preg_match_all('/^(.+)$/im', $zawartosc, $result);
  2. print_r($result);
-Damian-
Tak czy siak jest lipa, bo nie usuwa pustych linii tylko ładuje je jako pustą wartość do tablicy.
lobopol
To co dałem działa...
-Damian-
Mam:

  1. $dane = $_POST['asd'];
  2. preg_match_all('/^(.+)$/im', $dane, $result);
  3. print_r($result);


Skoro wpisuję:

Cytat
asd






asd2


i zamiast dać:

Cytat
Array ( [0] => Array ( [0] => asd [1] => asd2 ) [1] => Array ( [0] => asd [1] => asd2 ) )


daje:

Cytat
Array ( [0] => Array ( [0] => asd [1] => [2] => [3] => [4] => [5] => [6] => [7] => asd2 ) [1] => Array ( [0] => asd [1] => [2] => [3] => [4] => [5] => [6] => [7] => asd2 ) )


to chyba coś nie działa
lobopol
Sprawdziłem lokalnie zwraca:
Kod
Array
(
    [0] => Array
        (
            [0] => asd
            [1] => asd2
        )

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

)

jeżeli dasz coś ze spacjami w środku to może dać puste linie inaczej nie
-Damian-
To nie wiem jak to możliwe, bo u mnie zwraca to co wyżej napisałem
lobopol
Bo wstawiasz jakieś spacje zapewne podmień wyrażenie regularne na ^([a-z1-9-]+)$
SmokAnalog
Ale kombinujecie. Wywalić puste linie najprościej z array_filter.
-Damian-
Warning: preg_match_all(): No ending delimiter '/' found
lobopol
chyba logiczne, że trzeba podmienić to co między //
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.