webForumDet fria alternativet

Regexp. Hämta ut alla länkar på en sida.

ASP

14 svar · 667 visningar · startad av Mattias Nordin

Medlem sedan dec. 20051 056 inlägg
Frågan#1

Hej. Jag håller på att experimentera lite med regexp.

Hur gör man för att plocka ut själva länken ur en <a href="http://test.asp">abc</a> tagg?

Följande pattern fungerar för att få ut adressen:

regExp.Pattern = "(http://|www)([\S]*)"

Hur får jag $1$2 att sparas i en vanlig variabel?
Alltså strTest = $1$2

Medlem sedan juni 20019 519 inlägg
#2

Använd Matches och SubMatches:

Dim myRegExp, myMatches, myMatch
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.MultiLine = True
myRegExp.Pattern = "(http://|www)([\S]*)"
Set myMatches = myRegExp.Execute(String)
For Each myMatch In myMatches
	myMatch.Value 'Save this to a variable
Next
Medlem sedan dec. 20051 056 inlägg
#3

Det fungerar bra. Nu behöver jag bara förfina min regexp pattern. Det var inte helt enkelt.

Jag använder följande tester för att testa mig fram: http://www.regextester.com/
Men den ger mig inte samma resultat som om jag använder mig av: http://www.regular-expressions.info/vbscriptexample.html

Är det någon som har en online tester att rekommendera för vbscript regexp frågor?

Medlem sedan aug. 20003 575 inlägg
#4

Regex mönstren brör fungera snarlikt, jag gillar The Regulator 2.0 för att testa regexpatterns.

Medlem sedan dec. 20051 056 inlägg
#5

Har du en länk till mer info?

Medlem sedan aug. 20003 575 inlägg
#6

http://weblogs.asp.net/rosherove/archive/2004/05/28/144073.aspx
Fanns inte så mkt info men en nedladdningslänk :)

Medlem sedan juni 20019 519 inlägg
#7

webeye regExp tester fungera bra (när den är uppe) jag kör liknande koder: http://voigt.se/sandbox/regexp/

RegExpBuddy om du är villig att betala lite för ett underbart verktyg (enligt mig) ;)

Men uttrycken i VB och Javascript är så gott som identiskt. så det bör inte vara några problem.

Medlem sedan dec. 20051 056 inlägg
#8

För att hämta ut allt adresser ur en sida så verkar följande fungera bra:

'.Pattern = "(http://[^>]+|https://[^>]+|www[^>]+)"

Nu vill jag även hämta ut länk texten. Hur
Hur gör man en matchning mot allt annat än tex "</a>" ?

Medlem sedan juni 20019 519 inlägg
#9

Det är alla a-element du är ute efter? om jag har förstått det rätt?

Var vill du få ut för data på exempelvis:

<a href="http://webforum.nu" title="webForum">Webforum.nu!</a>

Ditt mönster just nu känns som lite konstigt då du kommer i exemplet ovan få ut
http://webforum.nu" title="webForum" som matchning. Och om det är så du vill få ut:

<a href="[blue][b][url]http://webforum.nu[/url][/b][/blue]" title="webForum">[blue][b]Webforum.nu![/b][/blue]</a>

Så är det lite annat än bara "myMatch.Value" då du vill få ut Submatch på träffen.

Medlem sedan dec. 20051 056 inlägg
#10

Det har du rätt i...

Hittade precis följande sida som har en pattern för "link text and url from anchor".
http://regexlib.com/UserPatterns.aspx?authorid=0bf8159c-d1b8-47c3-bd05-6590c1d16e9b

<a.+?href\=(?<link>.+?)(?=[>\s]).*?>(?<lnkText>.+?)</a>

Detta pattern fungerar utmärkt i "The regulator" men den fungerar inte när jag försöker exekvera den på min ASP sida. <link> varianten har jag inte sett tidigare. Är det den som inte stödjs i ASP?

.Pattern = "<a.+?href\=(?<link>.+?)(?=[>\s]).*?>(?<lnkText>.+?)</a>" 
'.Pattern = "(http://[^>]+|https://[^>]+|www[^>]+)"

Ger mig...

Microsoft VBScript runtime error '800a1399'
Syntax error in regular expression
/_inc_get_links.asp, line 46

>> Set myMatches = RegularExpressionObject.Execute(strHTML)

Vad kan jag göra för fel?

Medlem sedan juni 20019 519 inlägg
#11

Du kollar på .NET kod eller rättare sagt: du kan inte ha sätta alias på dina matches i ASP. (?<link> exempelvis
Plocka bort de

Men den matchar inte på exempelvis: <a href=" dvs med " och '. så att du märker av det ser det också.

Medlem sedan dec. 20051 056 inlägg
#12

Antog att det var något sådant. :)
Nu ser min kod ut som nedan:

		Set RegularExpressionObject = New RegExp
		With RegularExpressionObject
			'DESCRIPTION... 
			.Pattern = "<a.+?href\=(.+?)(?=[>\s]).*?>(.+?)</a>" 
			.IgnoreCase = True
			.Global = True
		End With
	
		Set myMatches = RegularExpressionObject.Execute(strHTML)
		For Each myMatch In myMatches
			'REMOVE ANY " LEFT IN THE STRING...
			varItemCount = varItemCount +1 
			response.write("<li> Match = " &varItemCount &":  " &myMatch.Value &"<p>")  
		Next

Jag testar mot följande textstycke:

Before text <a href="http://mattias.nordin.net"> L< ink> text1</a>
after text Before text <a href="http://mattias.nordin.net">Link text2</a> after text 
dd <a href="www.mattias.nordin.net" title=" < test title">Link text4</a> ee 
ff <a href="www.mattias.nordin.net">Link text5</a> GG

Min output är följande:

Match = 1: L< ink> text1
Match = 2: Link text2
Match = 3: Link text4
Match = 4: Link text5

Det börjar alltså fungera hyffsat bra. Tackar för att du leder denna blinda man ;)
Det jag inte riktigt förstår är hur jag splittar myMatch.Value. Jag vill kunna hämta ut både URL och Länktexten.
Kan det vara så att URL = $1$2 och länktexten är $3 ?

Hur får jag ut dessa separerat? :stud

Medlem sedan juni 20019 519 inlägg
#13

myMatch har ett som heter Submatches(integer)
där du vill ha $1 => 0 $2 => 2:

url = myMatch.SubMatches(0) & myMatch.SubMatches(1)
text =  myMatch.Submatches(2)
Medlem sedan dec. 20051 056 inlägg
#14

Du får härmed 28 virtuella credits av mig för hjälpen. Nu fungerar det till 99% som jag vill.

Det enda som jag inte har löst med mönstret nedan

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

är en länk med en html vinkel i länknamnet enligt...

<a href="http://mattias.nordin.net">test1<test2</a>

Men det kanske kan anses vara detaljer.

Medlem sedan juni 20019 519 inlägg
#15

</a> => <\/a>
Men $1 kan vara "http://mattias.nordin.net" när du egentligen vill ha http://mattias.nordin.net

mönstret lite snabb test kanske skulle vara:

<a.+?href\=['"]?(.+?)(?=[>\s'"])['"]?.*?>(.+?)<\/a>
259 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)