Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][inne]Wyrażenie regularne - znajdowanie adresów www niezawartych w tagach "[a]"
Forum PHP.pl > Forum > Przedszkole
Hellelujah
Witam. Potrzebuję wyrażenia regularnego, które dopasuje się do każdego adresu (typu http//...) NIE otoczonego tagiem [a]adres[/a] i NIE zawartego w tagu [a adres]...[/a]. Chodzi o poszerzenie funkcjonalności małego forum tak, żeby za pomocą preg_matcha samodzielnie robiło linki z wpisywanych adresów. Efekt ma być taki, że odnalezione gołe adresy wylądują w tagach [a]adres[/a]. Z resztą ma sobie radzic istniejący bbcode.

O co mi chodzi? Może najlepiej będzie na przykładzie:
Taki input:
Kod
http://example.com/ex/am/ple/
Zobacz: http://www.example.com/zobacz.php?zo=1&bacz=2 <- naprawdę świetne
[innytag]http://example.com/ex/am/ple/[/innytag]
Tego nie przetwarzaj: [a]http://example.com[/a]
Tego też: [a http://example.com/nvm]example[/a]

chcę przetworzyc na taki output:
Kod
[a]http://example.com/ex/am/ple/[/a]
Zobacz: [a]http://www.example.com/zobacz.php?zo=1&bacz=2[/a] <- naprawdę świetne
[innytag][a]http://example.com/ex/am/ple/[/a][/innytag]
Tego nie przetwarzaj: [a]http://example.com[/a]
Tego też: [a http://example.com/nvm]example[/a]


Oczywiście próbowałem napisać takiego prega sam, ale nic z tego nie wyszło, mimo przekopania kilku kursów...
Będę wdzięczny za pomoc.


EDIT:
Hmm, nadal żadnej odpowiedzi... Jeśli mój topic nie pasuje do przedszkola, proszę moderatora o przeniesienie.

A może jest inny sposób na rozwiązanie mojego problemu? Pomocy... sciana.gif
lukaszgolder
1) Usuń wszystkie [a] z tekstu
2) Usuń wszystkie [/a] z tekstu
3) Usuń wszystkie [a http://example.com/nvm]
4) Napisz prosty pattern, który zamienia wszystko co ma na początku http:// na [a]link[/a] lub [a link]link[/a]

W podpunkcie 4 możesz skorzystać z przykładu z manuala:
  1. $text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
  2. "<a href=\"\\0\">\\0</a>", $text);
athei
Do znalezienia wszystkich trafień możesz uzyć tego wzorca:
Kod
/(?<!(\[a\])|(\[a ))((http|https|ftp):\/\/|www)[a-z0-9\-\._]+\/?[a-z0-9_\.\-\?\+\/~=&#;,]*[a-z0-9\/]{1}/si

znajdzie on wszystkie adresy url, które na początku nie mają [a] albo [aSPACJA
Hellelujah
Świetnie - dzięki, athei. Właśnie tego szukałem. Czy mógłbyś jeszcze wyjaśnić, jak działa ten pierwszy atom "(?<!(\[a\])|(\[a ))"? Nie mogę tego znaleźć w dokumentacji.
athei
Jest w dokumentacji, http://www.pcre.org/pcre.txt
(?<!foo)bar does find an occurrence of "bar" that is not preceded by "foo".
W Twoim przypadku znajdzie występienie url, gdy nie jest poprzedzone [a] lub [aSPACJA.
O regexp masz tutaj http://www.regular-expressions.info/tutorial.html
Pomogłem daj + smile.gif
Hellelujah

Wcześniej szukałem w http://www.regular-expressions.info/reference.html i gdzieś jeszcze, ale takiego voodoo tam nie znalazłem biggrin.gif
Wielkie dzięki!
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.