2012-04-13 14 views
17

Przeczytałem wiele tutoriali na temat regex, ale to po prostu nie będzie w mojej głowie. Nigdy nie mogę sprawić, by moje wzorce działały. Mam nadzieję, że ktoś może pomóc.Znajdź ciąg php z regex

mam zmienną PHP ($ content), gdy trzeba znaleźć pewien wzór, który wygląda tak

[galeria :: nazwy/z/do/katalogu /]

chciałbym szukaj:

- starting with "[gallery::" 
- any other character (variable length) 
- ending with "]" 

dotychczas w PHP mam:

preg_match('/\[gallery\:/', $content, $matches, PREG_OFFSET_CAPTURE); 

mogę znaleźć [galeria: ale to wszystko . Chciałbym móc znaleźć resztę (: nazwa/of/the/folder /])

Każda pomoc jest doceniana! Dzięki!

Odpowiedz

26

Przymierz uchwycenie go:

preg_match("/\[gallery::(.*?)]/",$content,$m); 

Teraz $m jest tablicą:

0 => [gallery::/name/of/the/folder/] 
1 => /name/of/the/folder/ 
+0

Jeśli łańcuch jest „zaczynając od” czegoś, należy poprzedzić znak „^” do „\\ [galeria” – AndrewPK

+0

nie wiele occurences ([galeria ::/nazwa/z/katalogu/folder /] [gallery ::/name/of/the/folder /]) powodują problemy z używaniem chciwego przechwytywania na wszystkich postaciach? –

+0

to dopasuje '[gallery ::]' i zmieni go na '[gallery :: (. +?)]' – nathanjosiah

2

zmiana Twój regex do

'/\[gallery::([A-Za-z\/]+)\]/' 

Odkąd umieścić część folderu/ścieżki w nawiasie, powinieneś dostać z tego grupę przechwytującą.

+0

Potrzebuje innego ':', które nie wymaga ucieczki, a jeśli chcesz dopasować '/', powinieneś użyć innego znaku ogranicznika, takiego jak '#' – DaveRandom

+0

'[A-Za-z]' dla jednej rzeczy pasuje tylko do jednej litery , ale nie pasuje do "wszystkich znaków" - a na pewno nie tych dozwolonych w nazwach plików. –

+0

@Kolink, zanotuj znak + po parenach –

0
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
}