Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> preg_replace, ale z warunkiem
gargamel
post
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


Mamy kod:
  1. $access = "A"; // Zmienna dotycząca dostępu do określonych elementów tekstu, w tym przypadku może to być A, B lub C
  2. $text = "[access=A]Lorem ipsum dolor sit amet[/access], consectetur adipiscing elit.
  3. [access=B]Aenean laoreet[/access] neque eu arcu consequat tempus."; //Tekst z warunkami
  4. $pattern = "{\[access=(.*?)\](.*?)\[\/access\]}";
  5. echo preg_replace($pattern, "$2", $text);


Na chwilę obecną nie robi on nic sensownego, gdyż zwyczajnie usuwa z tekstu znaczniki [access=...] [/access] i wyświetla ich zawartość.
Potrzebuję zrobić myk aby zawartość z pomiędzy [access=...] i [/access] była wyświetlana tylko wtedy, gdy wartość przypisana znacznikowi (w powyższym kodzie A lub B ) była taka sama jak określona w zmiennej $access - w tym przypadku $access="A";
Tak aby w przytoczonym przykładzie fragment [access=B]Aenean laoreet[/access] nie został wyświetlony.
Jakieś pomysły ?

Ten post edytował gargamel 15.04.2011, 19:31:05
Go to the top of the page
+Quote Post
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Wstaw zmienną do wzorca:
  1. $pattern = "{\[access=".$access."\](.*?)\[\/access\]}";

Powinno zadziałać.
Go to the top of the page
+Quote Post
gargamel
post
Post #3





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


Ale moment, w ten sposób z [access=A]Lorem ipsum dolor sit amet[/access] wyświetli się zawartość tak jak trzeba, ale ta druga część wyświetli "[access=B]Aenean laoreet[/access]"
bo nie dopasuje do wzorca....
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Nie wiem, czy można to zrobić za pomocą jednego wyrażenia regularnego. Na pewno można zrobić przy pomocy dwóch:
  1. $access = "A"; // Zmienna dotycząca dostępu do określonych elementów tekstu, w tym przypadku może to być A, B lub C
  2. $text = "[access=A]Lorem ipsum dolor sit amet[/access], consectetur adipiscing elit.
  3. [access=B]Aenean laoreet[/access] neque eu arcu consequat tempus."; //Tekst z warunkami
  4. $dozwolone = "{\[access=".$access."\](.*?)\[\/access\]}";
  5. $niedozwolone = "{\[access=[^".$access."]\](.*?)\[\/access\]}";
  6. $text = preg_replace($dozwolone, "$1", $text);
  7. echo preg_replace($niedozwolone, "", $text);

Można jeszcze zastosować tablicę wzorców i zamienników:
  1. $access = "A"; // Zmienna dotycząca dostępu do określonych elementów tekstu, w tym przypadku może to być A, B lub C
  2. $text = "[access=A]Lorem ipsum dolor sit amet[/access], consectetur adipiscing elit.
  3. [access=B]Aenean laoreet[/access] neque eu arcu consequat tempus."; //Tekst z warunkami
  4. $patterns = array("{\[access=".$access."\](.*?)\[\/access\]}", "{\[access=[^".$access."]\](.*?)\[\/access\]}");
  5. $replacements = array("$1", "");
  6. echo preg_replace($patterns, $replacements, $text);


Ten post edytował mortus 15.04.2011, 20:52:05
Go to the top of the page
+Quote Post
gargamel
post
Post #5





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


Dokładnie o to mi chodziło, dzięki!
Nie mogę sobie poradzić jeszcze z jedną rzeczą. Mianowicie skrypt działa dobrze jeśli $access przyjmuje wartości pojedynczego znaku (A, B, C... cokolwiek).
Jak natomiast zrobić negację 2-giego wyrazu tablicy:
  1. $patterns = array("{\[access=".$access."\](.*?)\[\/access\]}", "{\[access=[^".$access."]\](.*?)\[\/access\]}");

Jeśli $access ma wartość np.: 'A' to negację mamy: ... [^A] ... no i wszystko gra. Jeśli za $access podstawimy np.: 'Abc' to mamy: [^Abc], a więc już nie do końca to o co chodzi...
Próbowałem [^(".$access.")], ale nie działa... :/
Go to the top of the page
+Quote Post
Bags_Bunny
post
Post #6





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


@gargamel: poczytaj Temat: Rozne od negowanie wyrazenia regularnego


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
mortus
post
Post #7





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


No tak. Podane wyżej rozwiązanie zadziała tylko wtedy, gdy dostęp będzie zdefiniowany za pomocą jednego znaku. Jeśli natomiast chcemy użyć słowa, musimy zastosować wspomniany w przytoczonym temacie assertion test. Kod:
  1. $access = "Aeg"; // Zmienna dotycząca dostępu do określonych elementów tekstu, w tym przypadku może to być A, B lub C
  2. $text = "[access=Aeg]Lorem ipsum dolor sit amet[/access], consectetur adipiscing elit.
  3. [access=Abc]Aenean laoreet[/access] neque eu arcu consequat tempus."; //Tekst z warunkami
  4. $patterns = array("{\[access=".$access."\](.*?)\[\/access\]}", "{\[access=(?!".$access."\]).*?\[\/access\]}");
  5. $replacements = array("$1", "");
  6. echo preg_replace($patterns, $replacements, $text);

Z drugiego wzorca usunąłem subpattern wyszukujący zawartość pomiędzy [access=...] i [/access], gdyż zawartość ta i tak nie będzie użyta.
Go to the top of the page
+Quote Post
gargamel
post
Post #8





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


mortus dokładnie o to mi chodziło. Podziękował bardzo!
Bags_Bunny dzięki za linka, ogólnie ciężko jest w necie znaleźć jakiś sensowny tutorial, czy kurs z wyrażeń regularnych. Bo większość zamyka się w kilku zdaniach podstaw...
Pozdro!
Go to the top of the page
+Quote Post
Bags_Bunny
post
Post #9





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


W manualu PHP jest to opisane tak jasno i dokładnie, że nic innego nie potrzeba. Kursy to na ogół ściema.


--------------------
rm -rf /*
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 01:56