Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dzielenie ciągu wyrażeniem regularnym
Forum PHP.pl > Forum > PHP
mike
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ę.
TomASS
Na pewno musisz to potraktować wyrażeniami regularnymi smile.gif

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

Powodzenia
mike
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!
Radarek
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. ?>
hwao
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
mike
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
hwao
  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:)
mike
Oj, przestańcie mnie dołować, że to jest takie proste laugh.gif laugh.gif

Zaczynam się uczyć wyrażeń tongue.gif
hwao
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
mike
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.
hwao
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
frelo
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.
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.