Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia Regularne - Problem z negacją
Forum PHP.pl > Forum > PHP
ladovnik
Witam. Ogólnie rozumiem wyrażenia regularne, lecz mam duży problem z negacją. Wiem że negacja to [^]. Próbuję, próbuję i nie wychodzi mi. Chciałbym przy pomocy negacji ułożyć wzorzec:
Kod
[tu_nie_ma_znaku_"]książka[tu_nie_ma_znaku_"]


Aby potem przy pomocy preg_replace zamienić wszystkie nieznajdujące się w cudzysłowach wyrazy książka na <B>książka</B> w zmiennej $str.

Próbowałem na wiele sposobów, zawsze rezultat niepomyślny. Czy Ktoś był by tak łaskawy i wytłumaczył mi (lub jeśli Komuś się nie chce, to wystarczy sam przykład, który mógłbym przeanalizować) jak postępować z tą negacją?


Pozdrawiam,
ladovnik
JoShiMa
Coś takiego?
Kod
[^\_]książka[^\_]
ladovnik
To nie działa. Nie widzę w tej negacji znaku ", ale dla pewności wklepałem to do preg_replace i nie zadziałało... tzn. wyrazy książka znajdujące się w cudzysłowach podmieniło, a inne nie...
dr_bonzo
  1. <pre><?php
  2.  
  3. $str = "Lorem ipsum dolor sit
  4. amet, consectetuer adipiscing
  5. elit. Cras tortor metus, suscipit
  6. sed, sagittis vitae, suscipit in, mi.
  7. In eget lacus. ksiazka Vivamus et arcu in elit
  8. rutrum venenatis. Donec rutrum, enim sit
  9. amet venenatis vulputate, eros quam
  10. convallis libero, non luctus tortor
  11. felis ornare odio. Sed ksiazka non erat. Phasellus
  12. sit amet est. Curabitur sed \"ksiazka\" magna. Duis
  13. nec elit. Nulla in neque eu odio elementum
  14. egestas. Proin vel tellus feugiat augue
  15. volutpat rhoncus. Aenean leo quam, semper
  16. sit amet, tempus et, euismod nec, quam.
  17. Duis ac est a purus iaculis \"ksiazka\" tempor. Sed
  18. nonummy tempus mauris. Ut porta, libero
  19. nec ultricies convallis, ipsum orci tristique
  20. lorem, ac rhoncus augue ligula sed quam. ";
  21.  
  22. $searchFor = 'ksiazka';
  23. $str2 = preg_replace( '#([^"])(' . $searchFor . ')([^"])#', '1<b>2</b>3', $str );
  24. print( $str );
  25. print( "\n\n<hr />\n\n" );
  26. print( $str2 );
  27. ?>
ladovnik
Dzięki dr_bonzo, to działa. Ale mam dwa zastrzeżenia:
1. Jeśli dodamy na początku zmiennej $str wyraz książka to jest on omijany, nie zostaje zamieniony... nie wiem dlaczego...
2. Jak trzeba by było zmodyfikować ten wzór, aby omijał również te wyrazy książka znajdujące się miedzy cudzysłowami, ale nie przylegającymi do nich? (np. "on mówi książka aa" lub "ale książka he").

Pozdrawiam,
ladovnik
dr_bonzo
Cytat
1. Jeśli dodamy na początku zmiennej $str wyraz książka to jest on omijany, nie zostaje zamieniony... nie wiem dlaczego...


  1. <?php
  2. $str2 = preg_replace( '#([^"]|^)(' . $searchFor . ')([^"]|$)#ms', '1<b>2</b>3', $str );
  3. ?>


2. pokombinuj z (.*?), mi sie juz nie chce/nie mam czasu
ladovnik
Dzięki, pokombinuje z tym drugim problemem (mimo to może mi się nie udać, więc jeśli ktoś będzie znał rozwiązanie, chętnie je zobaczę;)). Mam jeszcze pytanie do Ciebie - w jakim celu zamykając wzorzec dodałeś ms ?
dr_bonzo
Hmmm, ms jednak nie wplywaja na przetwarzanie wieloliniowych stringow tak jak przy preg_match(), tak ze mozesz to wyrzucic. Niepotrzebnie dodalem.
ladovnik
Niestety, nie udało mi się zrobić, aby wyrażenia książka nie znajdujące się bezpośrednio między cudzysłowami (np. "ale fajna ta książka") tez pomijało sad.gif Ktoś ma pomysł na to? Próbowałem na wiele sposobów z .*?/W ale zawsze źle...

Pozdrawiam,
ladovnik
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.