Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][HTML][PHP]Spacje i nowe linie - zapis
Quis
post 2.11.2016, 15:37:31
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 2.11.2016

Ostrzeżenie: (0%)
-----


Cześć i czołem!
Być może istnieje już taki temat, szukałem ale nic nie znalazłem, jeśli się mylę to proszę o naprostowanie.

Jak wygląda mój problem: mam zwykły formularz HTML, kodowany w utf-8, przesyłany do skryptu PHP. W skrypcie PHP zawartość pola textarea zapisuję w bazie danych MySQL. Co chciałbym uzyskać? Możliwość używania znaczników HTML w treści tego pola, z tym wyjątkiem, żeby tekst między <pre> a </pre> nie był potem przetwarzany na HTML, gdy chcę te dane z bazy wyciągnąć na stronę.
Używałem:
  1. htmlspecialchars($_POST['saveData'], ENT_QUOTES | ENT_HTML5); // przy zapisywaniu
  2. $data = htmlspecialchars_decode($result[0]); // result to dane wczytane, 0 - indeks pola z kodem HTML
  3.  
  4. // i zawartość między <pre> i </pre> ponownie kodowałem
  5. '/<pre>(.+?)<\/pre>/',
  6. function ($matches) {
  7. return htmlspecialchars($matches[1]);
  8. },
  9. $data);


Działało w miarę w porządku, problem jest taki, że jak dodam znak nowej linii między <pre> i </pre> to zawartość między tymi znacznikami jest zupełnie ignorowana. Kolejna kwestia, próbowałem używać funkcji trim po odczycie danych, aby usunąć nowe linie, i dopiero wtedy korzystać z preg_replace_callback, ale okazało się że trim w ogóle nie reaguje na wszelkie nowe linie, brak efektów, podglądałem źródło i kod jest taki jaki został zapisany do bazy danych (razem z nowymi liniami i wielokrotnymi spacjami).
Bardzo proszę kogoś obcykanego w kodowaniu znaków o pomoc, bardzo zależy mi na wytłumaczeniu które zrozumiem, albo przynajmniej będę w stanie do niego zadać jakieś pytania. Próbowałem używać str_replace przy zapisywaniu danych do bazy:
  1. $_POST['saveData'] = str_replace(" ", "", $_POST['saveData']);
  2. $_POST['saveData'] = str_replace("\n", "", $_POST['saveData']);

I bardzo mnie to zaskoczyło, bo okazało się że dane w bazie są widoczne razem z nowymi liniami i spacjami, ale na stronie już były w jednej linii. Teoretycznie było w porządku, usunęło mi też nowe linie i spacje z tekstu pomiędzy <pre> i </pre> przez co kod tam zawarty zlał się w jedną linię, co było niepożądane.

Krótkie wyjaśnienie, aby było wiadomo o co mi chodzi: piszę mini-bloga z artykułami w których będzie można zawrzeć kod HTML do formatowania tekstu, lecz chciałbym też aby kod HTML między <pre> i </pre> był ładnie wyświetlany na stronie.

Dziękuję serdecznie i pozdrawiam,
Dawid Zaroda (Quis)

------------------------
@EDIT

Dałem radę zrobić coś samemu, ale jest to raczej amatorszczyzna, chciałbym coś bardziej profesjonalnego biggrin.gif
Wstawię kodzik dla innych, może się przyda, po wczytaniu danych:
  1. $data = htmlspecialchars_decode($result[0], ENT_QUOTES | ENT_HTML5);
  2.  
  3. $openpos = stripos($data, "<pre>");
  4. $closepos = stripos($data, "</pre>", $openpos+4);
  5. while($openpos !== false and $closepos !== false)
  6. {
  7. $startOfCode = $openpos+5;
  8. $codeLength = $closepos-$openpos-5;
  9. $htmlCode = htmlspecialchars(substr($data, $startOfCode, $codeLength), ENT_NOQUOTES | ENT_HTML5);
  10. $data = substr_replace($data, $htmlCode, $startOfCode, $codeLength);
  11.  
  12. $openpos = stripos($data, "<pre>", $closepos+5);
  13. $closepos = stripos($data, "</pre>", $closepos+5);
  14. }


Gdyby ktoś miał dla mnie ciekawszą propozycję, to jestem zainteresowany.

Pozdrawiam

Ten post edytował Quis 2.11.2016, 15:46:35
Go to the top of the page
+Quote Post
KsaR
post 2.11.2016, 17:36:43
Post #2





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Cytat(Quis @ 2.11.2016, 15:37:31 ) *
Gdyby ktoś miał dla mnie ciekawszą propozycję, to jestem zainteresowany.

Pozdrawiam


  1. $data = preg_replace_callback('~<pre>(.+?)</pre>~s',
  2. function ($matches) {
  3. return '<pre>'.htmlspecialchars($matches[1]).'</pre>'; // te <pre></pre> skasuj jeśli zbędne.
  4. },
  5. $data
  6. );

Coś takiego ?

Ten post edytował KsaR 2.11.2016, 17:39:24


--------------------
Go to the top of the page
+Quote Post
Quis
post 2.11.2016, 19:33:41
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 2.11.2016

Ostrzeżenie: (0%)
-----


Niestety nie działa, podane dane:
  1. <pre><b>test</b></pre>
  2. <p><u>dsadasdsa</u></p>
  3. <pre>oninput="test('dsadsa');"</pre>
  4. <p><a href="http://google.pl/">sassdddfsfds</a></p>


Wynik na stronie:
  1. <b>test</b>
  2. dsadasdsa
  3.  
  4. oninput="test('dsadsa');"</pre>
  5. <p><a href="http://google.pl/">sassdddfsfds


Ale dałeś naprawdę ciekawą propozycję.

Ten post edytował Quis 2.11.2016, 19:52:53
Go to the top of the page
+Quote Post
KsaR
post 3.11.2016, 03:27:15
Post #4





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. $data = '<pre><b>test</b></pre>
  4. <p><u>dsadasdsa</u></p>
  5. <pre>oninput="test(\'dsadsa\');"</pre>
  6. <p><a href="http://google.pl/">sassdddfsfds</a></p>';
  7.  
  8. $data = preg_replace_callback('~<pre>(.+?)</pre>~s',
  9. function ($matches) {
  10. return htmlspecialchars($matches[1], ENT_QUOTES);
  11. },
  12. $data
  13. );
  14.  
  15. echo $data;

Dodałem tylko ENT_QUOTES, i skasowalem <pre></pre> z return.

Przykładowe demo:
https://eval.in/670887

Zwraca:
Kod
<b>test</b>
<p><u>dsadasdsa</u></p>
oninput="test('dsadsa');"
<p><a href="http://google.pl/">sassdddfsfds</a></p>

Czyli chyba tak, jak chciałeś.

Edit. Forum zamienia automatycznie &# 039; (bez spacji) na '

Ten post edytował KsaR 3.11.2016, 03:34:36


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 06:55