Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][inne]Wyrażenie regularne - znajdowanie adresów www niezawartych w tagach "[a]"
Hellelujah
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 4.06.2009

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


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... (IMG:style_emoticons/default/sciana.gif)

Ten post edytował Hellelujah 16.01.2010, 19:18:07
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
lukaszgolder
post
Post #2





Grupa: Zarejestrowani
Postów: 141
Pomógł: 17
Dołączył: 2.04.2008
Skąd: z Zabrza

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


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);


Ten post edytował lukaszgolder 16.01.2010, 19:26:28
Go to the top of the page
+Quote Post
athei
post
Post #3





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


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
Go to the top of the page
+Quote Post
Hellelujah
post
Post #4





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 4.06.2009

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


Ś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.
Go to the top of the page
+Quote Post
athei
post
Post #5





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


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 + (IMG:style_emoticons/default/smile.gif)


Ten post edytował athei 16.01.2010, 20:50:21
Go to the top of the page
+Quote Post
Hellelujah
post
Post #6





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 4.06.2009

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



Wcześniej szukałem w http://www.regular-expressions.info/reference.html i gdzieś jeszcze, ale takiego voodoo tam nie znalazłem (IMG:style_emoticons/default/biggrin.gif)
Wielkie dzięki!

Ten post edytował Hellelujah 16.01.2010, 20:57:15
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: 15.09.2025 - 02:02