Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dzielenie ciągu wyrażeniem regularnym, według tagów HTML
mike
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Witam, mam dość nietypowy problem, z którym nie mogę sobie poradzić, ponieważ nie znam wyrażeń regularnych, a nie podejrzewam, że można go rozwiązać w inny sposób.

Problem jest następujący:
Chciałbym z takiego oto ciągu:
Cytat
Jakiś tekst <sup>napisany w </sup> indeksie <sub>dolnym</sub>

uzyskać taką tablicę:
Kod
Array
(
    [0] => Jakiś tekst
    [1] => napisany w
    [2] => indeksie
    [3] => dolnym
)

Chociaż z drugiej strony przechodząc po takiej tablicy nie będę wiedział w jakim tagu (lub bez) był fragment, więc chyba dobrym pomysłem będzie żeby ciągi zawierały tagi:
Kod
Array
(
    [0] => Jakiś tekst
    [1] => <sup>napisany w</sup>
    [2] => indeksie
    [3] => <sub>dolnym</sub>
)
wtedy już da radę takie informacjie wyłuskać.

Tagów może być dowolna ilość, ale zawsze będe pozamykane i nie będą się zagnieżdżały, ani przecinały: <sup><sub></sup></sub>

Jeśli ktoś ma pomysł jak ugryść ten temat, bardzo proszę o podzielenie się.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
TomASS
post
Post #2





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


Na pewno musisz to potraktować wyrażeniami regularnymi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Zobacz tutaj a szczególnie "Grabbing HTML Tags" (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Powodzenia
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Hehe, kolejny raz sam sobie odpowiedam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Oto rozwiązanie (może i da się prościej, ale na razie nie wiem jak):
  1. <?php
  2.  
  3. echo $strText = "Jakiś tekst <sup>napisany w </sup> indeksie <sub>dolnym</sub>. Tak. Wiecej <sub>tagow</sub>. Jeszcze <sup>wiecej</sup>. I cos na koniec.";
  4.  
  5. $strPattern = '|\<\w+?\>.+?\</\w+?\>|';
  6.  
  7. preg_match_all( $strPattern, $strText, $arrMatches );
  8.  
  9. $arrBricks = array();
  10. $intOffset = 0;
  11. foreach ( $arrMatches[0] as $strMatch )
  12. {
  13. $intMatchPosition = strpos( $strText, $strMatch, $intOffset );
  14. $intMatchLength = strlen( $strMatch );
  15. $strPrevText = substr( $strText, $intOffset, $intMatchPosition - $intOffset );
  16. $arrBricks[] = $strPrevText;
  17. $arrBricks[] = $strMatch;
  18. $intOffset = $intMatchPosition + $intMatchLength;
  19. }
  20. $arrBricks[] = substr( $strText, $intOffset );
  21.  
  22. echo '<pre>' . print_r( $arrBricks, true ) . '</pre>';
  23.  
  24. ?>

Wynik:
Kod
Jakiś tekst <sup>napisany w </sup> indeksie <sub>dolnym</sub>. Tak. Wiecej <sub>tagow</sub>. Jeszcze <sup>wiecej</sup>. I cos na koniec.

Array
(
    [0] => Jakiś tekst
    [1] => <sup>napisany w </sup>
    [2] =>  indeksie
    [3] => <sub>dolnym</sub>
    [4] => . Tak. Wiecej
    [5] => <sub>tagow</sub>
    [6] => . Jeszcze
    [7] => <sup>wiecej</sup>
    [8] => . I cos na koniec.
)


P.S.
@frelu dzięki za pomoc!
Go to the top of the page
+Quote Post
Radarek
post
Post #4





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

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


Ajaja mike, wlasnie ci napisalem rozwiazanie, ale mnie ubiegles (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .

  1. <?php
  2. preg_match_all("#<([^>]+).*?</\\1>|[^<]+#", $str, $m);
  3. print_r($m);
  4.  
  5. ?>
Go to the top of the page
+Quote Post
hwao
post
Post #5


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




czytaj manual'a - zawsze chcialem to napisac moderatorowi (IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png)

preg_match_all()

Tam jest masa przykladow jak sparsowac html'a:)

---
Hehe, wiedziałem, że mi ktoś to napisze.
~hwao uwierz mi jest ich masa, ale żaden nie podchodzi pod moje zagadnienie.
Zresztą rozwiązanie już mam (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
~mike_mech


---
(IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png)
~mike_mech musialem (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Btw: Te Twoje rozwiazanie wydaje mi sie bardzo nie optymalne?
Tak sobie mysle czy nie lepiej by bylo uzyc preg_split() i "dzielic" znacznikami html'a (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) pomysl o ile to lepsze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ale to tylko moje IMHO! (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
pozdrawiam
~hwao
Go to the top of the page
+Quote Post
mike
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(Radarek @ 2006-02-07 11:37:03)
Ajaja mike, wlasnie ci napisalem rozwiazanie, ale mnie ubiegles (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .

Tak właśnie czułem że da się jednym.
Czas się nauczyć wyrażeń regularnych.

[pomógł] <- click
Go to the top of the page
+Quote Post
hwao
post
Post #7


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




  1. <?php
  2.  
  3. $sInput = 'costam <tag> costam </tag> lalaa <a> o :) </a> <br>'; // co prawda nie xml ale mozna poprawic wyraznie :)
  4.  
  5. $aOutput = preg_split( '@\</?\w+\>@si', $sInput );
  6.  
  7. print_r( $aOutput );
  8. ?>


z glowy.

Jezeli chcesz lapac jeszcze html'owskie tagi zapraszam do manuala masz nawet gotowce:)
Go to the top of the page
+Quote Post
mike
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Oj, przestańcie mnie dołować, że to jest takie proste (IMG:http://forum.php.pl/style_emoticons/default/laugh.gif) (IMG:http://forum.php.pl/style_emoticons/default/laugh.gif)

Zaczynam się uczyć wyrażeń (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
hwao
post
Post #9


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Hm.. to nie jest proste (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ale patrz

Sam napisales
Dzielenie ciągu wyrażeniem regularnym

to poco go "lapiesz"?

Trzeba jechac na logike (IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png)
Go to the top of the page
+Quote Post
mike
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


W sumie ~Radarek podał idealne dla mnie rozwiązanie.
Ale zapytam: ~hwao da się u ciebie tak, żeby tagi zostawały? Chyba nie. A mi potrzebna informacja skąd brały się poszczególne części tekstu.
Go to the top of the page
+Quote Post
hwao
post
Post #11


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




oczywiscie ze sie da;)
Pisałem ze zapraszam do Manuala (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) preg_split() (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pokaze Ci cos hardcorowego (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

  1. <?php
  2. $pattern = '/(<(?:[^<>]+(?:"[^"]*"|\\'[^']*\')?)+>)/';
  3.  
  4.  $html_string = '<html><body><p class="a<weird>name">The classname is not seen as a different tag</p></body></html>';
  5. $html_array = preg_split ('/(<(?:[^<>]+(?:"[^"]*"|\\'[^\\']*\\')?)+>)/', trim ($html), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
  6. ?>

Zródło preg_split() - komentarze, autor: Jappie

wyplowa
Kod
Array
(
   [0] => <html>
   [1] => <body>
   [2] => <p class="a<weird>name">
   [3] => The classname is not seen as a different tag
   [4] => </p>
   [5] => </body>
   [6] => </html>
)


Oczywiscie sa tez dzialajace prosciej i szybciej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

---
Chylę czoła.
~nospor wlep mi ostrzeżenie za niewiedzę (IMG:http://forum.php.pl/style_emoticons/default/laugh.gif)
~mike_mech
Go to the top of the page
+Quote Post
frelo
post
Post #12





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 7.02.2006

Ostrzeżenie: (10%)
X----


Mi się najbardziej podoba coś takiego:

  1. <?php
  2.  
  3. $split_pattern = '|(<\w+?>.+?</\w+?>)|';
  4. $result = preg_split( $split_pattern, $subject, -1, PREG_SPLIT_DELIM_CAPTURE );
  5.  
  6. ?>


Bo ponieważ piłka jest krótka a przy tym wyrażenie w miarę proste. Szacunek dla Radarka.

Ten post edytował frelo 7.02.2006, 13:55:03
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 18:04