Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne - odnalezienie fragmentu i usunięcie
Forum PHP.pl > Forum > PHP
Michael2318
Potrzebuję najpierw sprawdzić czy przykładowo zmienna $a (to jest string) zawiera w sobie coś takiego:
{costam.hehe}, gdzie największą wartość ma to co podkreśliłem, czyli costam. Dlaczego? Dlatego, że takie fragmenty:
{costam}, mają zostać nieruszone, z kolei takie jak już wyżej podałem:
{costam.hehe}
mają zniknąć w całości, ALE - wyrażenie regularne musi mi zwrócić to co podkreśliłem, a następnie skasować taki ciąg znaków:

Kod
<!-- costam -->
bla bla bla bla {costam.hehe} bla bla bla bla bla bla
<!-- costam -->


Podsumowując, skrypt musi znaleźć czy w zmiennej występuje taki wzorzec: {X.Y}, jeśli istnieje to pobiera mi wartość X i usuwa to:

Kod
<!-- X [obojetnie jaki tekst, do momentu] X -->


Ktoś byłby w stanie mi pomóc? Regularki to raczej nie jest moja mocna strona ;/
Kofel
To jak w końcu jest?
Kod
<!-- costam -->
bla bla bla bla {costam.hehe} bla bla bla bla bla bla
<!-- costam -->

czy:
Kod
<!-- costam bla bla bla bla {costam.hehe} bla bla bla bla bla bla costam -->
Michael2318
Tak:
Kod
<!-- costam -->
bla bla bla bla {costam.hehe} bla bla bla bla bla bla
<!-- costam -->


Ale w wyrażeniach nie ma znaczenia co będzie 'w środku' bo tak naprawdę znaczenie ma tylko początek i koniec:

Kod
<!-- costam (.*?) costam -->
Kofel
Proszę bardzo:
Kod
#<!-- (\S*).*{\1\..+}.*\1 -->#si


  1. $s = 'asdfdsadasasd dasdasdads
  2. <!-- costam bla bla bla
  3. bla {costam.a}bla bla bla bla
  4. bla bla costam --> adssdadasdasasdasdasdasd';
  5.  
  6. echo preg_replace('#<!-- (\S*).*{\1\..+}.*\1 -->#si', '', $s);
Michael2318
Dzięki serdeczne, tylko chyba się nie zrozumieliśmy do końca.

Najpierw chcę, aby skrypt przeszukał plik pod takim wzorcem: {X.Y}. Jeśli znajdzie to chciałbym aby to X zostało wstawione do wyrażenia, czyli chyba tak:

  1. echo preg_replace('#<!-- X(\S*).*{\1\..+}.*\1 X -->#si', '', $s);



Pomógłbyś mi jeszcze znaleźć to szukane X ?
Kofel
No napisałeś tak pogmatwanie smile.gif. Chcesz koniecznie znać wartość tego X? Czy tylko tak mi piszesz?
Dałem Ci gotowy kod, który wykonuje Twoje założenia, z tym, że nie wiesz jakie X zostało usunięte.
Michael2318
Chyba mi się udało:
  1. <?php
  2.  
  3. $text = 'lalala
  4. <!-- BEGIN costam -->
  5. jakis tekst
  6. <!-- END costam -->
  7. bebebe';
  8.  
  9. $dwa = '{costam.mojemoje}';
  10.  
  11. if ( preg_match("#{(.*?).(.*?)}#is", $dwa, $matches) )
  12. {
  13. $text = preg_replace('#<!-- '.$matches[0].'(\S*).*{\1\..+}.*\1 '.$matches[1].' -->#si', '', $text);
  14. }
  15. echo $text;
  16. ?>;
Michael2318
ehh no i finalnie nie działa, poprawiłem to co podałeś :/

Kod wygląda tak:

Kod
<!-- BEGIN costam -->
{costam.CZTERY}
<!-- END costam -->


I mimo tego:

  1. if ( preg_match("#{(.*?).(.*?)}#is", $tmp, $matches) )
  2. {
  3. $tmp = preg_replace('#<!-- BEGIN '.$matches[0].'.*'.$matches[1].' -->#si', '', $tmp);
  4. }


Na ekranie pojawia mi się:

{costam.CZTERY}

EDIT:

Aha i finalnie to jest jeden string, nie da:

  1. <?php
  2.  
  3. $text = 'lalala
  4. <!-- BEGIN costam -->
  5. {costam.mojemoje}
  6. <!-- END costam -->
  7. bebebe';
  8.  
  9. if ( preg_match("#{(.*?).(.*?)}#is", $text, $matches) )
  10. {
  11. $text = preg_replace('#<!-- BEGIN '.$matches[0].'.*'.$matches[1].' -->#si', '', $text);
  12. }
  13. echo $text;
  14. ?>



EDIT:

Dobra, działa. Tutaj:

  1. {(.*?).(.*?)}


Miało być tak:

  1. {(.*?)\.(.*?)}


+ dwa razy $matches[1] a nie 0 a potem 1 wink.gif

Dzięki.
Kofel
Chłopie, zdecyduj się. Przecież od pierwszej odpowiedzi podałem Ci poprawne rozwiązanie. Teraz w dodatku zmieniłeś założenie. biggrin.gif

  1. <?php
  2.  
  3. $text = 'lalala
  4. <!-- BEGIN costam -->
  5. {costam.mojemoje}
  6. <!-- END costam -->
  7. bebebe';
  8.  
  9. $text = preg_replace('#<!-- BEGIN (\S*).*{\1\..+}.*END \1 -->#si', '', $text);
  10.  
  11. echo $text;
Michael2318
Wyżej znowu nie uwzględniłeś X, ale nie ważne, poradziłem sobie.

  1. <?php
  2.  
  3. $text = 'lalala
  4. <!-- BEGIN costam -->
  5. {costam.mojemoje}
  6. <!-- END costam -->
  7. bebebe';
  8.  
  9. if ( preg_match("#{(.*?)\.(.*?)}#is", $text, $matches) )
  10. {
  11. $text = preg_replace('#<!-- BEGIN '.$matches[1].'.*'.$matches[1].' -->#si', '', $text);
  12. }
  13. echo $text;
  14. ?>


Dwa błędy były:

Nie tak:

  1. $text = preg_replace('#<!-- BEGIN '.$matches[0].'.*'.$matches[1].' -->#si', '', $text);


A tak:

  1. $text = preg_replace('#<!-- BEGIN '.$matches[1].'.*'.$matches[1].' -->#si', '', $text);


oraz nie tak:

  1. if ( preg_match("#{(.*?).(.*?)}#is", $text, $matches) )


tylko tak:

  1. if ( preg_match("#{(.*?)\.(.*?)}#is", $text, $matches) )


Leci pomógł, dzięki.
Kofel
Ja rozumiem, że Ty sobie jakimiś obejściami rozwiązałes problem.
Ale czy Ty w ogóle sprawdzałeś kod, który wkleiłem? Owszem, X jest uwzględniony, i działa bardzo dobrze.
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.