Jag frågade lite lugnt först, klarade nog inte mer än så för jag blir inte riktigt klok på ditt exempel... Jag provade det i ett litet program från gskinner.com men då maskeras ju hela raden. alltså <td>Just Kids</td>
Kör jag ditt yttryck på ovan html så får jag med två rader men inte den tredje (som är en länk) antar attd et har med hakarna att göra?
Men uttrycket då: <td>([^<]+)</td>
"<td>" gör att jag får med första taggen
() är en grupp av innehållet innanför..
[] är de också för att gruppera?
[^<]+ säger det att det ska börja < ?
([^<]+) känns som dubbla grupperingar?
Tror inte riktigt jag fattat hur man ska tänka med reg exp?
hämtar allt som är runt <td>...</td> som INTE är ett <
() => Grupp du kan hämta ut ($1)
[] => träffar vilket tecken som helst som är inne i []
[^] => Träffar vilket tecken som helst men INTE som är inne i []
i ditt exempel så får du två träffar:
<td>Ulla Danielsson</td>
..
<td>Just Kids</td>
men inte
<td><a href="/pub45095.html">Brombergs</a></td>
eftersom den inte matchar då uttrycket säger att vilket tecken som helst som inte är > och direkt efter det </td>> vilket inte stämmer på den raden.
Är det screen scraping du håller på med? :) I så fall är det mycket enklare att använda XPath. Jag håller själv på med ett projekt som läser ut info från webbsidor och använder inte regex utan XPath.
Man måste tänka på att strukturen på Html-sidorna kan ändras när som helst och då vill man nog slippa sitta och harva med kryptiska regexps. XPath-uttryck är mycket lättare att läsa och även om de kan vara bökiga att få till ibland är det ingenting jämfört med hur ens regex skulle se ut.
För att kunna ställa frågor mot en Html-sida behöver man tillgång till DOM-trädet men hur det ser ut i gammal, hemsk ASP vet jag inte. Det borde gå med en komponent (COM+) men jag känner inte till någon; inte så konstigt med tanke på att jag knappt rört ASP de senaste åren. Använder man Java eller .NET finns det betydligt fler alternativ, t.ex. TagSoup, JTidy resp. HtmlAgilityPack. I .NET finns det även en sorts portning av Sizzle, en viktig del av jQuery, som gör att man kan söka i dokumentet med CSS-selektorer m.m. Tråkigt nog fick jag det inte att rulla så jag fick nöja mig med XPath istället.
Jämför regex:et med ett slarvigt, otestat och troligen icke-fungerande XPath:
Som sagt, uttrrcket är inte testat och eftersom jag ingte är nån guru på något vis så funkar den nog inte rakt uppochned. Men visst ser det enklare ut!
Regexp är sjukt användbart i vissa lägen men inte här.
hämtar allt som är runt <td>...</td> som INTE är ett <
Men när jag provar i gskinner's program så markeras ju även td taggarna?
Jag måste vara dum på riktigt för det går inte in i mitt huvud hur jag ska tänka.
Alltså om man ska beskriva <td>([^<]+)</td> i en enda lång mening så:
välja allt som börjar med <td> och sen alla tecken förutom "<" och tecknen får förekomma 1 eller oändlig antal gånger??
Säg att jag ska plocka ut namnet på översättaren bara då, alltså Ulla Danielsson:
Kan man få med det som villkor att denna raden <td>Ulla Danielsson</td> där det föregås av <th>Översättare</th>?
dAeK:
Tyvärr är det gammal hemsk asp jag använder :bire Har inte hunnit provat sp mcyket med asp.net. Du har helt rätt, det är screen scraping jag försöker mig på..
Tror ju inte sidan kommer förändras så mycket i detta fallet och skulle det vara så får man väll korrigera för det..
Men intressant förslag.. Kan va något att tänka på i framtiden..
Ja, självklart markeras hela uttrycket, men du har grupperat vad du vill hämta ut med ().
Eftersom jag måste vara extremt trög på att förklara saker så ge jag dig vad regexp säger:
[^>]+
Match any character that is NOT a “>” «[^>]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Och för din andra fråga: Ja om Det är en konstant som heter Översäattare följt av en td.
Tror trögheten ligger hos mig, har tittat på det lite tidigare men nästan gett upp.. Men jag ska ge det ett nytt försök:)
Hur fick du fram texten "vad regexp säger" något program som beskriver det så eller egenkomponerat?
andra frågan där: Om du vill? hur skulle uttrycket se ut om jag vill få fram namnet på översättaren. Det är en konstant.
Tänkte att jag kunde köra två regexp. En för att ta fram översättaren (Översäattare) och en för att ta fram titeln...
Sista exmplet var klockrent!! Gällde väll att få radbyte och matning rätt där:)
Exemplet fungerar kanon i asp men när jag provar med jacascript så vill det sig inte..
får bara felet
Fel: invalid regular expression flag <
Källkodsfil: http://127.0.0.1/studlit/incl/jscripts.js
Rad: 37
strHTML = "<th>jhhjljlj</th> <td>testar</td> för att se om regular expressions"
var strHTML = xmlhttp.responseText;
var exp = new RegExp("<th>Författare</th>[\n\s]+<td>([^<]+)</td>");
Rad 37: var expr = new RegExp(strHTML,"<th>Författare</th>[\n\s]+<td>([^<]+)</td>");
det svar jag får från uttrycket. Skriver jag ut det på en sida så får jag ju bara titeln. Kanon! Men om jag fyller i ett formulär med det jag får tillbaka så är ju td och th taggarna med.. Hur kommer det sig?
Nu gjorde jag så att jag körde några "replace" för att få bort dom men var bara nyfiken på varför jag får med dom då?
Set objRegExp = New regexp
objRegExp.Global = false
objRegExp.IgnoreCase = true
objRegExp.Pattern = "<th>Originaltitel:</th>[\n\s]+<td>([^<]+)</td>"
Set hittade = objRegExp.Execute(strHTML)
titel = Replace(hittade.item(0),"Originaltitel:","")
titel = Replace(titel,"<th></th> <td>","")
Set objRegExp = Nothing
nu är mina "smidiga" replace satser med ocksp :)
gjorde även ett försök att få ut författarnamnet om det är en a tagg innan som i detta:
Men där blir det stopp igen.
jag skulle ju vilja ha så här och en negation (eller vad det heter) som säger att jag vill ha det som inte står inom < > ? eller är det feltänk?
... objRegExp.Pattern = "<th>Originaltitel:</th>[\n\s]+<td>([^<]+)</td>"
Set MyMatch = objRegExp.Execute(strHTML)
If MyMatch.count > 0 Then
titel = MyMatch(0).SubMatches(0)
End If
Sen kan du inte bara köra mitt uttryck rakt upp och ner, du kommer med olika saker gång på gång, regexp uttrycket säger att den bara hämtar text som är runt en <td></td> där det inte finns någon html kod.
Och ja, självklart kan du hämta ut allt som finns i <td>..</td> även html och sen ersätta all html med inget, men frågan är ens om du få göra detta för Bokia.
Ok, är väll med på att jag inte kan använda ditt rakt av, men lever och lär av det:)
Gällande bokia så är detta bara för privat bruk så det lär nog inte orsaka någon större belastning för dom, kan väll se det som att jag bara tittar på deras utbud precis som vilket besökare som helst §e
Men som i exemplet då det finns en a tag innanför td taggarna..
Borde jag inte kunna använda samma som tidigare fast med villkoret att jag inte vill ha något som finns inom <>. Alltså all text inom td taggarna som inte börjar med < och slutar med >?