Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne
Forum PHP.pl > Forum > PHP
Yorki
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)).*$)
Crozin
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. }


Yorki
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. );
Crozin
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+$#
Yorki
Gdyby ktoś kiedyś szukał rozwiązania :

Kod
(^(?!.*(auth($|\/)|core($|\/))).*$)
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.