webForumDet fria alternativet

Få ut värde ur en sträng?

ASP

10 svar · 586 visningar · startad av Quid

Medlem sedan juni 20006 022 inlägg
Frågan#1

Hej, jag har en tabell i en databas som innehåller en massa text, t.ex.

<DWUser version="5.1.0.1" uid="18" oid="1" dw4uid="ROBERT" guid="c9c37de3-a7cc-4c22-b996-8e90b63ec89d" oguid="effbdb06-e9d5-437e-80d7-fd79577b5b33" name="robert" active="true" eMail="robert@domän.se" distribution="NetworkStartup" oldIniSettingsForDw="[3610844937Basket]&#xD;&#xA;DISPLAYMODE=0&#xD;&#xA;[leverant_12809116.169_RESULT]&#xD;&#xA;COLFIXED=1&#xD;&#xA;COLUMNWIDTHS=00173000340004000069000630009700083&#xD;&#xA;[Kundfakt_12833897.778_RESULT]&#xD;&#xA;COLFIXED=0&#xD;&#xA;COLUMNWIDTHS=000830009200065000650002100048000380004200042&#xD;&#xA;[5822078DW5WASTE]&#xD;&#xA;DISPLAYMODE=0&#xD;&#xA;" oldIniSettingsForViewer="[Dacs4]&#xD;&#xA;Color=002550025500000&#xD;&#xA;TextColor=002550000000000&#xD;&#xA;FontSize=20&#xD;&#xA;LineSize=5&#xD;&#xA;MerkerSize=50&#xD;&#xA;LastOCRSetting=&#xD;&#xA;LastBarcodeSetting=&#xD;&#xA;FontBold=400&#xD;&#xA;FontItalic=0&#xD;&#xA;" securityLevel="Normal"></DWUser>

Jag vill bara ha ut själva epostadressen, i detta fallet <robert@domän.se>, men den kan variera ifrån post till post.

Hur löser jag det?

Medlem sedan juni 20019 519 inlägg
#2

Är det "eMail" du vill flagga för att få ut e-post? eller är det bara e-post mönstret?

RegExp känns som det självklara valet i så fall.

Medlem sedan mars 20041 505 inlägg
#3

Det där ser ut som en del ur ett XML-dokument.
Om så är fallet så kan du läsa attributen med XMLDOM istället. :)

Medlem sedan juni 20006 022 inlägg
#4

voigtann1 skrev:

Är det "eMail" du vill flagga för att få ut e-post? eller är det bara e-post mönstret?

RegExp känns som det självklara valet i så fall.

Det kommer alltid att stå eMail framför adressen som jag vill ha ut.

Troxy skrev:

Det där ser ut som en del ur ett XML-dokument.
Om så är fallet så kan du läsa attributen med XMLDOM istället. :)

Ja, det är en del av ett XML-dokument som är lagrat i en databas, men det måste läsas ifrån databasen.

Medlem sedan mars 20041 505 inlägg
#5

Quid skrev:

Ja, det är en del av ett XML-dokument som är lagrat i en databas, men det måste läsas ifrån databasen.

Är det ett giltigt XML-dokument i sin helhet?
Isf, läs dokumentet med Microsoft.XMLDOM, hämta attributet med XPath.

Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.LoadXML(data)
xml.SetProperty("SelectionLanguage", "XPath")
attr = xml.SelectNodes(xpath)

Just XPath-biten är jag dålig på :p

Medlem sedan juni 20006 022 inlägg
#6

Jag kommer tyvärr inte kunna läsa ut det med hjälp av Microsoft.XMLDOM.

Några andra ideer?

Medlem sedan nov. 20014 054 inlägg
#7

voigtann1: Uttrycker sig, så känns regexp som det naturliga valet i detta..

Men mönster.. det är inte min grej.

Medlem sedan juni 20006 022 inlägg
#8

Inte min heller :)

Medlem sedan juni 20019 519 inlägg
#9
<%
Response.Write GetValue(Str, "guid")

Function GetValue(str, target)
	With New RegExp
	    .Global = True
	    .IgnoreCase = True
	    .Pattern = target & "=""([^""]+)"""
	    Dim m, match
	    set m = .Execute(str)
	    For each match in m
		GetValue = match.SubMatches(0)
	    Next
	End With
End Function
%>

Med din sträng ovan får jag ut resultatet:
c9c37de3-a7cc-4c22-b996-8e90b63ec89deffbdb06-e9d5-437e-80d7-fd79577b5b33

behöver kanske inte köra for each loop men it works ;)

Medlem sedan juni 20006 022 inlägg
#10

Klockrent, tack.

Orkar du förklara hur det funkar?

Själv skrev jag ihop en annan lösning, som funkar, men den känns inte lika snygg :)

v_split = Split(v_string," ")
For Each item In v_split
	IF lcase(left(item, 5)) = "email" THEN
		v_strip = Replace(item, "eMail=", "")
		v_strip = Left(v_strip, (Len(v_strip) -1))
		v_strip = Right(v_strip, (Len(v_strip) -1))
		v_email = v_strip
	END IF
Next
Medlem sedan juni 20019 519 inlägg
#11

RegExp mönstret letar efter (i mitt exempel) efter ett uttryck:

guid="([^"]+)"
Vi skapar en grupp () för att kunna få ut datan ifrån vad det nu är för data
[^"]+ = Träffa allt som INTE är " mellan en träff till hur många träffar den kan hitta (greedy)

För varje träff vi hitta (regExp.execute) så hämtar vi ut gruppen 1 (i arrayn är det 0)

GetValue = match.SubMatches(0)
268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)