Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]REGEXP dzielenie stringa na kawalki
Forum PHP.pl > Forum > Przedszkole
phoenix84
Witam... tym razem w sumie lenistwo, ale cos modze, ale efekt nie ten co bym chcial... winksmiley.jpg))
potrzebowalbym malutka funkcje, ale taka ze:

wczytuje sobie dluuugi string... no itrzeba go podzielic na kawalki nie dluzsze niz 1350 znakow... ale nie moze go przerwac w srodku wyrazu ani w tagach html (sle kod strony)... chodzi o to, zeby nie rozerwalo wyrazu, ani skladni html... mozecie cos pomoc?

rzadko prosze o gotowca... ale w regexp jestem noga i co bym nie wymodzil to i tak dziala inaczej niz bym chcial smile.gif)

pozdrawiam,

k.
flashdev
Nie wydaje mi się, żeby regexp był tutaj dobrym pomysłem, ale mogę się mylić oczywiście.
phoenix84
chodzi mi o preg match czy jakos tak smile.gif zeby nie te tagi, to bym zwykle explode(' ', $x) zrobil... winksmiley.jpg i bym zliczal dlugosc... no ale sa tagi... smile.gif
amii
Pisane na szybko i bez testów

  1. function pobierz($ciag) {
  2. $od = 0;
  3. $do = 1350;
  4. $dlugosc = strlen($ciag);
  5. $podmien = array();
  6.  
  7. $ciag = str_replace(">", "> ", $ciag);
  8. $ciag = str_replace("<", " <", $ciag);
  9. $ciag = str_replace("?", " ?", $ciag);
  10. $ciag = str_replace(".", " .", $ciag);
  11. $ciag = str_replace(",", " ,", $ciag);
  12. $ciag = str_replace("!", " !", $ciag);
  13.  
  14.  
  15. for ($i=0; $i<$dlugosc+1350; $i+=1350) {
  16.  
  17.  
  18. while (strpos($ciag, ' ', $do)) != true {
  19. $do--;
  20. }
  21.  
  22. $podmien[$i] = substr($ciag, $od, $do);
  23. $od += 1350;
  24. $do += $do;
  25.  
  26.  
  27. if ($do > $dlugosc) $podmien[$i] = substr($podmien[$i], $od, $dlugosc); //jesli przekroczymy w petli dlugosc to obcinamy text to jego dlugosci
  28.  
  29. }
  30.  
  31. foreach ($podmien as $key => $value) {
  32. $podmien[$key] = str_replace("> ", ">", $value);
  33. $podmien[$key] = str_replace(" <", "<", $value);
  34. $podmien[$key] = str_replace(" ?", "?", $value);
  35. $podmien[$key] = str_replace(" .", ".", $value);
  36. $podmien[$key] = str_replace(" ,", ",", $value);
  37. $podmien[$key] = str_replace(" !", "!", $value);
  38. }
  39.  
  40. return $podmien;
  41. }
phoenix84
hmmm... a uwzglednia to tagi html?questionmark.gif bo chyba nie widze... a moze po prostu zmeczenie...

pozdrawiam,

k.
MateuszS
W uwzględnieniu tagów HTML chodzi Ci o to żeby otwarcie np <b> i zamknięcie </b> było zawsze w jednej części? nie może być tak że <b> jest w 1 części a </b> w 2?
gothye
wordwrap
amii
Właśnie dopisałem
phoenix84
Cytat(MateuszS @ 7.01.2011, 22:45:29 ) *
W uwzględnieniu tagów HTML chodzi Ci o to żeby otwarcie np <b> i zamknięcie </b> było zawsze w jednej części? nie może być tak że <b> jest w 1 części a </b> w 2?


moze byc rozdzielone (nawet powinno, bo jak caly string to gigantyczna tabela lub div to wtedy cala funkcja lezy) <b> od </b>... ale nie moze byc rozdzielone <a href=""> (jest spacja miedzy a i href tongue.gif), to cala magia z ktora sobie nie moge poradzic... caly tag musi byc w jednym kawalku

generalne zasade dalbym taka... rozdzial moze nastapic jedynie na spacji, ale nie jesli znajduje sie miedzy < i >... i mysle ze wlasnie do tego regexp jest potrzebne... bo wtedy wytnie tagi wtedy podzieli i wklei tagi z powortem... ale nie mam pomyslu jak zrobic by to dzialalo...

k.
amii
No w sumie racja a może zamiast tych str_replace daj coś takiego:

$pat = '#<(.*)/?>#i'; /zamieniamy wszystko pomiędzy znakami <> to może być ryzykowne
function podmiana($matches) {
$zwrot = str_replace(' ', '%::%' $matches[0]);
return $zwrot;
}

$ciag = preg_replace_callback($pat, "podmiana()", $ciag);

Później dajesz odwrotną funkcję, która podmienia te śmieszne znaczki na ' ' i teoretycznie powinno działać, tylko jak w tekście masz nierówną liczbę <> lub gdzieś są normalnie używane te znaki to będzie sieczka
phoenix84
Cytat(amii @ 8.01.2011, 00:16:47 ) *
No w sumie racja a może zamiast tych str_replace daj coś takiego:

$pat = '#<(.*)/?>#i'; /zamieniamy wszystko pomiędzy znakami <> to może być ryzykowne
function podmiana($matches) {
$zwrot = str_replace(' ', '%::%' $matches[0]);
return $zwrot;
}

$ciag = preg_replace_callback($pat, "podmiana()", $ciag);

Później dajesz odwrotną funkcję, która podmienia te śmieszne znaczki na ' ' i teoretycznie powinno działać, tylko jak w tekście masz nierówną liczbę <> lub gdzieś są normalnie używane te znaki to będzie sieczka


Twoje rozwiazanie jest na tyle zaawansowane, ze go kompletnie nie rozumiem... ani jak dziala, ani jak z niego skorzystac... winksmiley.jpg) jesli chodzi o zamiane na tagow na jakis string to tez jest problem... bo tagi tez musza byc wyslane w takiej postaci w jakich je "bog" stworzyl... winksmiley.jpg)

k.
Noidea
  1. <pre>
  2. <?php
  3.  
  4. // |
  5. $test1 = "aaaaaaaaa blaa ala ma kota i psa";
  6. $test2 = "bbbbbbbbb blaa ala <a href=\"ma.png\">ma</a> kota i psa";
  7.  
  8. echo "1:\n";
  9. while( $test1 != "" )
  10. {
  11. echo cutString( $test1, 25 ) . "\n";
  12. }
  13.  
  14. echo "\n\n";
  15. echo "2:\n";
  16. while( $test2 != "" )
  17. {
  18. echo cutString( $test2, 25 ) . "\n";
  19. }
  20.  
  21.  
  22.  
  23. function cutString( &$str, $len )
  24. {
  25. if( strlen( $str ) <= $len )
  26. {
  27. $cuttedStr = $str;
  28. $str = "";
  29. }
  30. else
  31. {
  32. $cuttingExpression = "~^.{0," . $len . "}(?=\s|$)~s";
  33. $cleaningExpression = "~<[^>]*$~";
  34.  
  35. preg_match( $cuttingExpression, $str, $match );
  36. $match[0] = preg_replace( $cleaningExpression, "", $match[0] );
  37.  
  38. $cuttedStr = rtrim( $match[0] );
  39. $str = substr( $str, strlen( $cuttedStr ) );
  40. $str = ltrim( $str );
  41. }
  42.  
  43. return $cuttedStr;
  44. }
  45.  
  46. ?>
  47. </pre>


Pierwsze wyrażenie pobiera max $len znaków, ale w taki sposób, żeby zaraz za nimi znajdował się biały znak. Drugie sprawdza, czy na końcu mamy "rozerwany" tag HTML. Jeśli tak, to go usuwa. Funkcja wycina znaleziony tekst ze zmiennej $str i zwraca jako wynik, więc można jej używać jak w przykładzie.
Problem pojawi się, gdy w tekście znajdzie sie wyraz/tag HTML dłuższy niż $len. Kod wpadnie wtedy w nieskończona pętlę, ale przy długości 1350 raczej nie będzie z tym problemu.
phoenix84
dokaldnie o to chodzilo!

dzieki!
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.