Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_replace
Forum PHP.pl > Forum > PHP
gargamel
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 ?
mortus
Wstaw zmienną do wzorca:
  1. $pattern = "{\[access=".$access."\](.*?)\[\/access\]}";

Powinno zadziałać.
gargamel
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....
mortus
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);
gargamel
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... :/
Bags_Bunny
@gargamel: poczytaj Temat: Rozne od negowanie wyrazenia regularnego
mortus
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.
gargamel
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!
Bags_Bunny
W manualu PHP jest to opisane tak jasno i dokładnie, że nic innego nie potrzeba. Kursy to na ogół ściema.
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.