Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyrażenia regularne
Forum PHP.pl > Forum > Przedszkole
Capellini
Chciałbym żeby jakiś tekst spełniał moje wyrażenie regularne wtedy kiedy zaczyna się od '<' potem następuje coś innego niż 'b', 'i', 'u', 'strong', 'a', a później jest '>'. Przykłady:

Dla: '<div>' zwraca true

Dla: '<b>' zwraca false

Dla: '<body>' zwraca true

Dla: '<strong>' zwraca false

Próbowałem w ten sposób:

<(^(b|a|u|s|i|strong))>

czyli najpierw '<' potem jakiś tekst inny niż 'b', 'i', 'u', 'strong', 'a', a na końcu '>'
wookieb
Kod
<[^u|i|strong|b|a]>
Capellini
Teraz za każdym razem zwraca false

Czy nawiasy kwadratowe przypadkiem nie oznaczają tylko jednego znaku?
wookieb
Pokaż kod i tekst jaki sprawdzasz.
Capellini
Sprawdzam tutaj: http://maciek.lasyk.info/regexp_checker.html

Działa tylko jeżeli pomiędzy nawiasami trójkątnymi jest jeden znak i inny niż 'b', 'a', 'u' itd., np. działa dla '<m>'
zegarek84
Cytat(Capellini @ 8.03.2009, 10:12:15 ) *
czyli najpierw '<' potem jakiś tekst inny niż 'b', 'i', 'u', 'strong', 'a', a na końcu '>'

nie wiem do czego Ci to potrzebne więc wyszukałem tylko te znaczniki które ma znajdować wyrażenie regularne, jeśli jakieś znaczniki co mają być zaczynają się tak samo jak znaczniki co ich ma nie być to w nawiasie (?=body) poprzez wstawienie znaku | i "słowa" dodajesz kolejne wyjątki które mają należeć do wyrażenia.... - dało sie prościej gdyby działały symbole łączone w wyrażeniach - tzn teoretycznie są ale coś u mnie wywala błąd - widać nie obsługuje (więc trochu okrężna drogą ale też działa winksmiley.jpg...

ps. w nawiasie (?!b|a|u|strong|i|s) dodajesz te znaki których ma nie być - przy czym skoro strong nie jest na liście wyjątków to tam bez potrzeby został umieszczony ^^ - zawsze przy lub dopasowuje z lewej strony dlatego w pierwszej kolejnosci sprawdza czy jest wyjątek a potem czy nie ma wyjątków....


  1. <?php
  2. $text='Dla: "<div>" zwraca true
  3. Dla: "<b>" zwraca false
  4. Dla: "<body>" zwraca true
  5. Dla: "<strong>" zwraca false';
  6.  
  7. preg_match_all('/<(?:(?=body)|(?!b|a|u|strong|i|s))([^>]+?)>/is', $text, $matches);
  8. echo '<pre>';
  9. print_r($matches);
  10. echo '</pre>';
  11. ?>
Capellini
zegarek, czy mógłbyś mi jeszcze wytłumaczyć jak to działa? Co oznacza '?=' i '?!'?
Hazel
Pewnie by mógł, ale po co ma tłumaczyć, skoro sam możesz o tym poczytać smile.gif

http://en.wikipedia.org/wiki/Regular_expression
Capellini
W tekście, do którego dałeś linka nie znalazłem nic na temat wykrzyknika. Nadal nie wiem co oznacza '?=' i "?!"
zegarek84
http://codebase.pl/php/15 - ten kurs jest słaby jeśli chodzi o wyrażenia regularne ale jest wspomniane tam o grupowaniu tych wyrażeń w nawiasach - czyli bedziesz wiedział co który nawias znaczy... nie widzę tam jeszcze tego:
(?<nazwa>) - grupa nazwana. Umożliwia dostęp do grupy bez podawania jej numeru (nazwana zmienna - ale tworzy też odwołanie numeryczne)

są jeszcze "symbole łączone" ale coś nie obsługuje ich mój serwerek lub to tylko teorja ;p (dużo by ułatwiły)
Capellini
Kod
<(?!b|a|u|strong|i|s)>


No dobra, a dlaczego nie działa po prostu takie coś jak powyżej?
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.