Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dzielenie ciągu wyrażeniem regularnym, według tagów HTML
mike
post 7.02.2006, 10:14:37
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
TomASS
post 7.02.2006, 10:17:17
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 smile.gif

Zobacz tutaj a szczególnie "Grabbing HTML Tags" smile.gif

Powodzenia


--------------------
Go to the top of the page
+Quote Post
mike
post 7.02.2006, 11:28:46
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 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 7.02.2006, 11:37:03
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 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 7.02.2006, 11:43:13
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 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 tongue.gif
~mike_mech


---
Rkingsmiley.png
~mike_mech musialem 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 winksmiley.jpg pomysl o ile to lepsze smile.gif ale to tylko moje IMHO! smile.gif
pozdrawiam
~hwao
Go to the top of the page
+Quote Post
mike
post 7.02.2006, 11:53:23
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 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 7.02.2006, 12:00:39
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 7.02.2006, 12:11:35
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 laugh.gif laugh.gif

Zaczynam się uczyć wyrażeń tongue.gif
Go to the top of the page
+Quote Post
hwao
post 7.02.2006, 12:16:26
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 smile.gif ale patrz

Sam napisales
Dzielenie ciągu wyrażeniem regularnym

to poco go "lapiesz"?

Trzeba jechac na logike Rkingsmiley.png
Go to the top of the page
+Quote Post
mike
post 7.02.2006, 12:31:22
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 7.02.2006, 12:38:12
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 biggrin.gif preg_split() smile.gif

Pokaze Ci cos hardcorowego 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 smile.gif

---
Chylę czoła.
~nospor wlep mi ostrzeżenie za niewiedzę laugh.gif
~mike_mech
Go to the top of the page
+Quote Post
frelo
post 7.02.2006, 13:49:38
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


--------------------
monitorowanie pozycji w google - googlemon.pl
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: 19.07.2025 - 05:53