Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Operacja na zmiennej
ActivePlayer
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Jak usunąć ze zmiennej wszystkie "\\xx" po znalezionym pierwszym "xx"

tzn.

jest
"BB//CC//AA//AA//CC"
i chcę zeby po znalezieniu pierwszego AA usunięto kazde następne czyli ma wyglądać tak:

"BB//CC//AA//CC"

jest ktos w stanie mi pomóc ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Puciek
post
Post #2


TAO programowania


Grupa: Zarejestrowani
Postów: 340
Pomógł: 3
Dołączył: 25.03.2003
Skąd: ze słoika

Ostrzeżenie: (30%)
XX---


Rozwiazanie dookola, bez testu i na szybko:
  1. <?php
  2. $tmp = explode( 'AA', $string );
  3. $tmp[1] = str_replace( '//AA' ,'', $tmp[1] );
  4. $string = implode( '', '', $tmp );
  5. ?>
Go to the top of the page
+Quote Post
silence
post
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 14.07.2004
Skąd: Trzebinia

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


Wg mnie ten kod usunie pierwsze AA, a resztę zostawi...
Ja bym to zrobił tak:
  1. <?php
  2. $search = '//AA'; // Poszukiwany string
  3. $pos = strpos($string, $search); // Szukamy pierwszego wystąpienia
  4. $before = str_split($string, $pos); // Przed pierwszym wystąpieniem
  5. $after = strstr($string, $search); // Po pierwszym wystąpieniu
  6. $string = $before[0].$after; // Łączymy stringa
  7. ?>

Nie jestem pewny co do miejsca cięcia przed wystąpieniem $search (może się uciąć o jeden znak w lewo, w prawo, albo dobrze (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ). Bez testów.
Go to the top of the page
+Quote Post
mpps
post
Post #4





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 14.03.2003
Skąd: Szczecin

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


@ActivePlayer rozumiem, że chodzi Tobie o dowolne powtarzające się ciągi znaków (XX zastępuje dowolny ciąg)?
powyższe rozwiązania są dobre tylko w sytuacji wystąpienia konkretnego ciągu znaków a nie konkretnego POWTARZAJĄCEGO SIę ciągu znaków, ale masz już drugą połowę skryptu (tą ważniejszą) (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował mpps 2.10.2004, 20:35:37
Go to the top of the page
+Quote Post
silence
post
Post #5





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 14.07.2004
Skąd: Trzebinia

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


mpps, masz rację, skrytykowałem Pućka, a sam zrobiłem taki błąd...
To może tak:
  1. <?php
  2. $search = '//AA'; // Poszukiwany string
  3. $pos = strpos($string, $search); // Szukamy pierwszego wystąpienia
  4. $before = str_split($string, $pos); // Przed pierwszym wystąpieniem + $search
  5. $after = substr($string, -1*(strlen($search)-$pos) ); // Po pierwszym wystąpieniu
  6. $after = str_replace($search, '', $after); // Szuka i usuwa $search
  7. $string = $before[0].$search.$after; // Łączymy stringa
  8. ?>

Znowu nie jestem pewny $after (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Ten post edytował silence 2.10.2004, 20:50:14
Go to the top of the page
+Quote Post
Puciek
post
Post #6


TAO programowania


Grupa: Zarejestrowani
Postów: 340
Pomógł: 3
Dołączył: 25.03.2003
Skąd: ze słoika

Ostrzeżenie: (30%)
XX---


@silence: Moj skrypt ktory napisalem usunie wszyskie //AA poza pierwszym, bo tak to dziala.
Go to the top of the page
+Quote Post
silence
post
Post #7





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 14.07.2004
Skąd: Trzebinia

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


No to po kolei:
  1. <?php
  2. $tmp = explode( 'AA', $string );
  3. ?>

Mamy tablicę $tmp rozdzieloną przez AA (bez AA). Coś takiego:
[0] => "BB//CC//"
[1] => "//"
[2] => "//CC"
  1. <?php
  2. $tmp[1] = str_replace( '//AA' ,'', $tmp[1] );
  3. ?>

Usuwasz wszystkie '//AA' z $tmp[1].
[0] => "BB//CC//"
[1] => "//"
[2] => "//CC"
  1. <?php
  2. $string = implode( '', '', $tmp );
  3. ?>

Po pierwsze implode()" title="Zobacz w manualu PHP" target="_manual ma tylko trzy argumenty, no, ale nie ważne. Sklejamy:
$string:
BB//CC//////CC

Ten post edytował silence 3.10.2004, 11:49:35
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


doba to teraz sprecyzuje bo z leksza nie czaje teraz nic (za malo sypiam chyba)

mam generowanego dynamicznie stringa...
wygląda on np.

aa/bb/aa/cc/aa/bb
po przejsciu przes funkcje powinien wyglądac tak:
aa/bb/cc

next example

aa/cc/aa/cc/cc
wynik
aa/cc

poprostu ma usunąc podwójne takie same wartosci pomiedzy "/"
Go to the top of the page
+Quote Post
DeyV
post
Post #9





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Oto przykładowe rozwiazanie twojego problemu
  1. <?
  2. function onlyOne( $sText , $sGlue = '/' )
  3. {
  4. $aDane = explode( $sGlue , $sText );
  5. if( empty( $aDane ) )
  6. {
  7. return false;
  8. }
  9. $iCount = count( $aDane );
  10.  
  11. $aList = array();
  12. $sWynik = '';
  13. for( $ii=0; $ii< $iCount; $ii++ )
  14. {
  15. if( isset( $aList[ $aDane[$ii] ] ) )
  16. {
  17. continue;
  18. }
  19.  
  20. $sWynik .= $aDane[$ii];
  21. $sWynik .= $sGlue ;
  22.  
  23. $aList[ $aDane[$ii] ] = true;
  24. }
  25.  
  26. return $sWynik; 
  27. }
  28.  
  29. $sText = 'aa/aa/bb/aa/cc/cc/aa/bb/bb';
  30. echo onlyOne( $sText ); // zwraca aa/bb/cc/
  31.  
  32. ?>


a to najprostrzy a na pewno działajacy kod rozwiązujacy problem o którym mówili moi przedmówcy (a dokładniej mpps ), tj. usuwaine wszystkich występujących wielokrotnie po sobie, lecz w jednym ciagu, wyrażeń.

  1. <?
  2. function noDuble( $sText , $sGlue = '/' )
  3. {
  4. $aDane = explode( $sGlue , $sText );
  5. if( empty( $aDane ) )
  6. {
  7. return false;
  8. }
  9. $iCount = count( $aDane );
  10.  
  11.  
  12. $sActual = '';
  13. $sWynik = '';
  14. for( $ii=0; $ii< $iCount; $ii++ )
  15. {
  16. if( $sActual == $aDane[$ii] )
  17. {
  18. continue;
  19. }
  20. $sWynik .= $aDane[$ii];
  21. $sWynik .= $sGlue ;
  22.  
  23. $sActual = $aDane[$ii];
  24. }
  25. return $sWynik;
  26. }
  27.  
  28.  
  29. $sText = 'aa/aa/bb/aa/cc/cc/aa/bb/bb';
  30. echo noDuble( $sText ); // zwraca aa/bb/aa/cc/aa/bb/
  31. ?>
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: 23.08.2025 - 15:50