Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operacja na zmiennej
Forum PHP.pl > Forum > Przedszkole
ActivePlayer
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 ?
Puciek
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. ?>
silence
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 biggrin.gif). Bez testów.
mpps
@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ą) winksmiley.jpg
silence
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 biggrin.gif
Puciek
@silence: Moj skrypt ktory napisalem usunie wszyskie //AA poza pierwszym, bo tak to dziala.
silence
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
ActivePlayer
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 "/"
DeyV
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. ?>
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.