Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyrażenia regularne, Negacja
Yorki
post
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 2
Dołączył: 12.09.2005

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


Witam, chcę napisać wyrażenie regularne które będzie sprawdzało czy link jest zwykłą statyczną stroną czy modułem.

Powiedzmy, że mam dwa moduły core i auth.

Oto przykładowe linki :
  • test - wyrażenie powinno zwrócić prawdę (to jest strona statyczna)
  • core - wyrażenie powinno zwrócić fałsz (jest to moduł)
  • auth/login - wyrażenie powinno zwrócić fałsz (jest to moduł)


Moje wyrażenie to :
  1. "/[^(auth|core)]/"


Do testu używam:
  1. $preg = "/[^(auth|core)]/";
  2.  
  3. if (preg_match($preg , 'test')){
  4. echo "<span style='color:green'>Test: Page</span><br>";
  5. } else {
  6. echo "<span style='color:red'>Test: Controller</span><br>";
  7. }
  8.  
  9. if (preg_match($preg , 'core')){
  10. echo "<span style='color:red'>Core: Page</span><br>";
  11. } else {
  12. echo "<span style='color:green'>Core: Controller</span><br>";
  13. }
  14.  
  15. if (preg_match($preg , 'auth/login')){
  16. echo "<span style='color:red'>auth/login: Page</span><br>";
  17. } else {
  18. echo "<span style='color:green'>auth/login: Controller</span><br>";
  19. }


Niestety auth rozpoznaje mi jako stronę statyczną. Można przekształcić to wyrażenie w taki sposób żeby zwracało fałsz wtedy gdy zaczyna się od 'auth' lub 'core' i ignoruje resztę znaków?

EDIT:
No więc teraz jestem na etapie, gdzie wszystko ładnie śmiga, ale jeśli będzie link author to uzna to jako moduł auth..

  1. (^(?!.*(auth|core)).*$)


Ten post edytował Yorki 7.02.2012, 18:38:13
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


A po co tutaj w ogóle wyrażenia regularne, skoro jedyne co robisz to sprawdzasz czy podany ciąg rozpoczyna się od danej wartości?
  1. function stringStartsWith($string, $prefix) {
  2. $prefixes = (array) $prefix;
  3.  
  4. foreach ($prefixes as $p) {
  5. if (strpos($string, $p) === 0) {
  6. return true;
  7. }
  8. }
  9.  
  10. return false;
  11. }
  12.  
  13. // ...
  14.  
  15. if (stringStartsWith('Ala ma kota', 'Ala')) {
  16. echo 'Tekst rozpoczyna się od "Ala"';
  17. }
  18.  
  19. if (stringStartsWith('auth/login', array('auth', 'core'))) {
  20. echo 'Ścieżka jest modułem';
  21. }


Go to the top of the page
+Quote Post
Yorki
post
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 2
Dołączył: 12.09.2005

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


Cytat(Crozin @ 7.02.2012, 18:39:18 ) *
A po co tutaj w ogóle wyrażenia regularne, skoro jedyne co robisz to sprawdzasz czy podany ciąg rozpoczyna się od danej wartości?
  1. function stringStartsWith($string, $prefix) {
  2. $prefixes = (array) $prefix;
  3.  
  4. foreach ($prefixes as $p) {
  5. if (strpos($string, $p) === 0) {
  6. return true;
  7. }
  8. }
  9.  
  10. return false;
  11. }
  12.  
  13. // ...
  14.  
  15. if (stringStartsWith('Ala ma kota', 'Ala')) {
  16. echo 'Tekst rozpoczyna się od "Ala"';
  17. }
  18.  
  19. if (stringStartsWith('auth/login', array('auth', 'core'))) {
  20. echo 'Ścieżka jest modułem';
  21. }


Dlatego :

  1. $routes = array(
  2. 'standard_page' => new Zend_Controller_Router_Route_Regex(
  3. "(^(?!.*($modules)).*$)",
  4. 'module' => 'core',
  5. 'controller' => 'standardpage', 'action' => 'showpage',
  6. 'script' => '/index.php'
  7. ),
  8. 1 => 'page_name'
  9. )
  10. )
  11. );


Ten post edytował Yorki 7.02.2012, 19:29:21
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Nic nie stoi na przeszkodzie byś stworzył własny typ Route'a (nijak nie da się tego chyba sensownie przetłumaczyć?), wystarczy by implementował interfejs Zend_Controller_Router_Route_Regex.
2. http://www.php.net/manual/en/regexp.reference.assertions.php
3. #^(?!core|auth)\w+$#
Go to the top of the page
+Quote Post
Yorki
post
Post #5





Grupa: Zarejestrowani
Postów: 45
Pomógł: 2
Dołączył: 12.09.2005

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


Gdyby ktoś kiedyś szukał rozwiązania :

Kod
(^(?!.*(auth($|\/)|core($|\/))).*$)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 8.10.2025 - 20:29