[PHP] Preg - wyciąganie linków

0

Napisałem pregmatcha takiego:

|<a[^>]+\s?href\s?=[\s"']([>"'\s]+)[\s"'>]+[>][>]?([</sup>>]+.*)</\s?a\s?>|U

Potrzebuje wyciagnać adres URL oraz text linka czyli anchora.
Teraz mi pokazuje URL ale w anchorze jest zbyt duzo np.

target="_blank" class="lewa">skrypt

Czy potraficie wyeliminować z anchora te htmlowe śmiecie ?

0
#<a\s+href="(.+?)"[^>]+>(.+?)</a>#si
0

Znaczy to:

#<a\s+href="(.+?)"[^>]*>(.+?)</a>#si

Nie zawsze te smiecie sa.

0

hehe jakby to było takie proste to by było super ale przeciez nie zawsze url jest w cudzysłowie ""

XXXX
XXXX
XXXX
XXXX

i jeszce przed href tez moga byc inne znaki niż spacja :)

0

href POWINIEN być w cudzysłowie. Ale można kombinować inaczej. Piszę z pamięci, może nie działać:
@<a(\s.)?\shref=(["'])([^'"\s])\2(\s.)?>(.?)</a>@
P.S. adres ląduje w $3, zaś etykieta w $5.

0
Adam.Pilorz napisał(a)

href POWINIEN być w cudzysłowie. Ale można kombinować inaczej. Piszę z pamięci, może nie działać:
@<a(\s.)?\shref=(["'])([^'"\s])\2(\s.)?>(.?)</a>@
P.S. adres ląduje w $3, zaś etykieta w $5.

Nie działa to zupełnie

Ten moj parser jest dobry tylko chodzi mi o miejsce zamknieia peirwszego taga i rozpoczecie anchora.

Bo jesli byl cudzyslow po URL to musi byc jeszcze >
Jesli byl > po URL Od razu to wtedy Od razu tu ma zaczynac anchora

0
<a[^>]+href="?([^\s"]+)"?[^>]*>(.+?)</a>
0

nie umiem w ogóle wprawdzie wyrażeń regularnych ale tak na prosto

|<a\s.?href=["']?\s["']?([^\s"'>]+)[>]*>([<]+)</a[>\s]?|si

;P

0
Adamo napisał(a)

nie umiem w ogóle wprawdzie wyrażeń regularnych ale tak na prosto

|<a[^h]+href=["']?\s*["']?([^\s"'>]+)[>]*>([<]+)</a[>\s]?|si

;P

A czemu nie h? => [^h]

A tak na marginesie zapraszam na moj wyklad:
http://www.forum.kasart98.com/viewtopic.php?t=11145

;P

0
maniek_2 napisał(a)

A czemu nie h? => [^h]

sorry nie czaję, możesz rozwinąć ?

ale jak zapraszasz na swój wykład to najpierw mógłbyś przykozaczyć krótkim i działającym wyrażaniem

0

<quote=Adamo>|<a[^h]+href=["']?\s*["']?([^\s"'>]+)[^>]*>([^<]+)</a[>\s]?|si
</quote>

Przed anchorem występuje takie coś: ([^\s"'>]+)[^>]*>

Wiec jesli w pierwszym nawiasie wystąpi znak ">" to ten na końcu już nie bedzie istnieć. Więc w ogóle nie znajdzie tego linka :)

np.

XXX

0
shivanwk napisał(a)

Wiec jesli w pierwszym nawiasie wystąpi znak ">" to ten na końcu już nie bedzie istnieć. Więc w ogóle nie znajdzie tego linka :)

np.

XXX

a sprawdź w praktyce ... przecież nie mówię że to jest poprawne, optymalne wyjście ale przynajmniej jako jedyne działa (z podanych powyżej) do wszystkich przykładów (podanych powyżej) - tym bardziej że wyrażeń pisać nie umiem, sora już się nie odzywam, zaproście lepiej Marooneda czy piechnata ;P

a wiem czemu tak napisałeś - bo myślisz że wykluczające jest tylko jeśli przed każdym znakiem z nawiasu kwadratowego da się ^ a nie przed wszystkimi (wnioskując z twojego pierwszego posta)

otóż nie trzeba dawać [abcd] tylko wystarczy [^abcd]

0
Adamo napisał(a)

a wiem czemu tak napisałeś - bo myślisz że wykluczające jest tylko jeśli przed każdym znakiem z nawiasu kwadratowego da się ^ a nie przed wszystkimi (wnioskując z twojego pierwszego posta)

otóż nie trzeba dawać [abcd] tylko wystarczy [^abcd]

Dzięki za podpowiedź...

Znalazłem już parsera który jest b. uniwersalny :)

'|(<a[^>]+\s?href\s?=[\s"'])([>"'\s]+)[\s"'>]+[>][>]?(?<=>)(.*)</\s?a\s?>|U'

nie ma to jak siedzieć 2 godziny nad jedną linijką

0
shivanwk napisał(a)

(<a[^>]+

bardzo proszę o wytłumaczenie czemu ten początek nie pożera wszystkiego do >

0

dlatego że parser jest tak zbudowany ze minimalna ilosc znaków wrzuca do danych nawiasów. :)

0

no powiedzmy że to może normalne (chociaż program do sprawdzania wyrażeń regularnych tego nie rozumie - ja też w 100% nie). tak w ogóle to przestań nazywać każde wyrażenie regularne parserem bo się połapać nie można o czym akurat mówisz

0

problem w tym, że '|(<a[^>]+\s?href\s?=[\s"'])([>"'\s]+)[\s"'>]+[>][>]?(?<=>)(.*)</\s?a\s?>|U'
jest błędny :)
Zauważ sobie na to, jak jest skonstruowany sam początek: <a[^>]+\s?href - tutaj <abhref przypasuje, co już widać, że jest niedopuszczalnym błędem. Dalej szukać mi się nie chce.

0

Moje pierwsze podejście - siła wyższa każe mi spać, więc nie zdążyłem dokończyć :/
Nie patrzyłem za bardzo na Wasze rozwiązania, ale o ile widzę, są błędne.

<a.*?href\s*=\s*(['"])?(?(1)(.*?)\1|([^\s>]+))\s*(?(?=>)>|[^>]+>)(.*?)</a>
adres leci do \2 lub do \3 [należy testować co nie jest puste]
text widoczny leci do \4

problemem jest taki link:
></font>d">tekst
fragment do poprawy, który za to odpowiada, to:
(?(?=>)>|[^>]+>)

0
Adamo napisał(a)
maniek_2 napisał(a)

A czemu nie h? => [^h]

sorry nie czaję, możesz rozwinąć ?

ale jak zapraszasz na swój wykład to najpierw mógłbyś przykozaczyć krótkim i działającym wyrażaniem

[^h] nie moze byc przed href, bo tam mozesz dac np. id="h".
Przykozaczac jak Ty to nieudolnie robisz, nie mam po co, bo nie musze Ci udowadniac, ze znam wyrazenia regularne.

0
maniek_2 napisał(a)

[^h] nie moze byc przed href, bo tam mozesz dac np. id="h".
Przykozaczac jak Ty to nieudolnie robisz, nie mam po co, bo nie musze Ci udowadniac, ze znam wyrazenia regularne.

dokładnie, fucktycznie, ja myślałem że chcesz napisać że czemu napisałem h? zamiast [^h] - chociaż h? nie użyłem. Ale i tak by więcej znalazło niż <a\s*href - tym bardziej że to znajduje <ahref, a większość podanych powyżej wyrażeń pożre np <acronim href - wiem że bez sensu przykład no ale. Nie chciałem ciebie obrażać, bo widzę że masz coraz bardziej podniesiony ton, chodziło mi o to że jak ktoś zaprasza na swój wykład to by miał większe wzięcie jakby pokazał że jest master - a mam wrażenie że to odebrałeś "jestem lepszy niż ty, hahaha" ;)

Marooned - w sumie to jest większy problem niż to ">" - bo to chyba mało dopuszczalne jest - że wynik nie wiadomo do którego miejsca ląduje, i większy problem że np znajdzie coś takiego
href="adres" tekst

znajdzie jako adres - adres, a jako tekst linka wszystko między </a> ... </a>

0

Ogolnie moze byc przeciez cos takiego:

"> href="ad>es"

albo w najgorszym przypadku:

"> href="ad>es" po

Dlatego do tak skomplikowych danych raczej bym nie zaczynal od wyrazen regularnych bo tym sie tego nie przejdzie. Jezeli juz pominiemy zaglebienia linku w linku, ale uwzglednimy id=" >" to bym wolal to juz zrobic w ten sposob:

<a(.+?)</a>

Z funkcja preg_replace_callback() i w niej zalatwic \1.

0

Niby tak, ale napisanie jednego wyrażenia, które skuma wszystkie kombinacje to masakra.
np.
<a title="href=http://a.pl" href="adres.wlasciwy" class=href onclick=f()><script>alert('</a>')</script></a>
Dlatego powinno się przygotować nieco text, którym będziemy szukać IMHO

[edited]
o, nie zauważyłem drugiej strony.. no.. maniek_2 to samo napisał, samo regexp w tym przypadku to zły pomysł

0

wystarczy że w środku taga nie dopuszczamy znaku ">"

<a([^>]+?)

0
shivanwk napisał(a)

wystarczy że w środku taga nie dopuszczamy znaku ">"
Jeśli zakładasz takie coś, to wszystko znacznie się upraszcza - ale.. czy możesz to założyć? należy pamiętać o JS wew.

0

Co do tego > to możnaby się zastanowić - wszak może występować tylko i wyłącznie w parze " ". Stąd wniosek, że jak odpowiednio napisać wyrażenie regularne, to mogłoby to ignorować. Coś na kształt:

... ([^">]"[^"]")* ...

Oczywiście do przemyślenia, czy to jest poprawne i czy w ogóle ma sens, ale taki pomysł mi wlazł do głowy.

0
Adamo napisał(a)

Marooned - w sumie to jest większy problem niż to ">" - bo to chyba mało dopuszczalne jest - że wynik nie wiadomo do którego miejsca ląduje, i większy problem że np znajdzie coś takiego
To nie jest żaden problem.
Jeśli wynik jest w \2 lub w \3 to na wyjściu piszesz "\2\3" i zawsze jest ok.

0

No i nie znajduje - nie wiem o co chodzi?
user image

0

Napisałę coś takiego :

|(<a[^>]+\s?href\s?=[\s"'])([>"'\s]+[\s"'>]+[^>][>]?.*</\s?a\s?>)|U'

i mi działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1