12. september 2008 - 15:58Der er
20 kommentarer og 1 løsning
Plukke dele af en tekst ud
Hej eksperter,
Jeg vil høre om der findes noget program eller script der kan hjælpe mig med at plukke dele af en tekst ud for så at indsætte den i en bestemt rækkefølge?
Eksempel på tekst (meget simplificeret!): ##-----------------------------## Bestiller: Navn: Navn på bruger og brugernavn
Af eksemplet skulle jeg fx kunne plukke ud og indsætte på ny således: Navn på bruger og brugernavn; Testprodukt
Er der overhovedet noget der kan gøre dette for mig uden alt for store armbevægelser. Har haft kig på autoit, men synes det ser alt for omfattende ud at sætte sig ind i....
På forhånd tak og jeg undskylder hvis noget af ovenstående er uforståeligt. Mistede det jeg havde skrevet 2 gange...
Det kan laves på mange forskellige måder, men det kræver selvfølgelig noget programmering. Et simplificeret eksempel kan ikke rigtig bruges, hvis der skal laves noget du faktisk kan bruge til noget, da det skal programmeres specifikt. Jeg ville nok lave det med Regular Expressions i PHP.
Hmm ja kan egentlig godt huske jeg meget har kigget lidt på det for lang tid siden.
Det eksempel jeg har givet opstiller egentlig de problemstiller jeg skal kunne knække. At den kun skal trække noget af det ud ud fra specifikke linjer.
Kan du evt. prøve at lave et eksempel på hvordan du ville kunne trække det ud jeg har givet eksempel på med regex?
<script type="text/javascript"> var x = "Bestiller:\nNavn: Navn på bruger og brugernavn\n\nLevering til:\nNavn: Et andet navn\n\nProdukt: Testprodukt"; x += "\n"; var reg = /:(.*?)[\n]/gm var txt = x.match(reg); txt = txt.join("").replace(/:[\n\r]/g,"").replace(/[\r\n]/g,"; ").replace(/:\s/g,""); alert(txt); </script>
-- da javascript ikke tillader strengvariabler over flere linjer, har jeg sat det sammen ...
-- i php må man jo godt have fler-linjers tekst-variabler, så der eksisterer problemet ikke (og så kommer tekst-variablen jo også i en strøm med linjedelingstegn i !-)
-- ovenstående fjerner ikke den midterste, men det kan du jo selv arbejde vider med, f.eks. vil denne gøre det, men så er vi ovre i noget _meget_ specifikt, som ikke nødvendigvis passer:
txt = txt.replace(/; $/,"").replace(/;.*?;/,";");
-- og så kan alle mine replaces sandsynligvis skrives meget kortere med en mere avanceret regExp !-)
Tak for forslaget roenving. Det ser dog ikke ud til jeg vil kunne bruge det da jeg gerne blot skulle kunne indsætte en lang stump tekst og derefter få resultatet tilbage uden selv at skulle gøre noget. Og så vidt jeg kan se på dit eksempel skal jeg sidde og indsætte linjeskift selv hele tiden...?
Ah okay.. Syntes også det virkede lidt mærkeligt hvis det var på den anden måde... Jeg vil prøve at se om jeg kan få det til at funke... Men hvordan vil ovenstående fungere.. Kan jeg få en tekstboks hvor jeg kan sætte teksten ind i og så trykke generer eller sådan?
<script type="text/javascript"> function showExtractedValues(){ var x = document.getElementById("minTekstbox").firstChild.nodeValue; x += "\n"; var reg = /:(.*?)[\n]/gm var txt = x.match(reg); txt = txt.join("").replace(/:[\n\r]/g,"").replace(/[\r\n]/g,"; ").replace(/:\s/g,""); document.getElementById("minTekstbox").firstChild.nodeValue = txt.replace(/; $/,"").replace(/;.*?;/,";"); } </script>
Og kan du ikke komme med en lille forklaring på hvordan dit script fungerer? Vil man kunne bruge det på en meget lang tekst med mange linjeskift osv. - eller bliver det så pludselig for omfangsrigt?
Hos mig viser den dette, når jeg indsætter din test-tekst i spørgsmålet:
Navn på bruger og brugernavn; Testprodukt
-- hvilket er det, jeg har forstået, du ville have !-)
-- og forklaringen på det, jeg gør i scriptet er ganske simpel (?)
først tager jeg fat i den text-node, der ligger inde i texareaet (x= osv.) dernæst opretter jeg en regExp, der kan fange det, der står på en linje efter kolon'et ... så tager værdien fra textnoden, tilføjer et linjeskift bagest og matcher det med regExp'en, denne øvelse returnerer et array, hvoraf der er et par næsten tomme linjer ... -- dette array sættes så sammen til en tekststreng uden noget imellem -- .join("") derefter fjernes forekomster af et kolon med linjeskift lige efter -- .replace(/:[\r\n]+/g,"") -- så byttes resterende linjeskift ud med semikolon og et mellemrum -- .replace(/[\r\n]+/g,"; ") -- så skal kolon'erne ikke bruges som adskiller mere, så de fjernes sammen med evt. efterfølgende mellemrum/whitespace -- .replace(/:\s/g,"");
-- så skal det afsluttende semikolon fjernes -- .replace(/; $/,"") -- og til sidst fjerner jeg den forekomst i midten (den, der har semikolonner både foran og bagved !-) -- .replace(/;.*?;/,";");
-- skal du også have forklaringer på indholdet af de 6 regExps, skal du lige skrive !o]
-- og jeg skal da klart sige, at jeg bare har prøvet udtrykkene i min editors browser (som er en eller anden windows-komponent, der er baseret på IE !-)
-- og en version, som umiddelbart virker i de browsere, jeg bruger:
<script type="text/javascript"> function showExtractedValues(){ var x = document.getElementById("minTekstbox"); var reg = /:([^\r\n]*?)[\r\n]/gm; var txt = ((x.value?x.value:x.firstChild.nodeValue)+"\n").match(reg); txt = txt.join("").replace(/:[\r\n]+/g,"").replace(/[\r\n]+/g,"; ").replace(/:\s/g,""); x.value = txt.replace(/; $/,"").replace(/;.*?;/,";"); } </script>
-- den er dog ikke fuldt kompatibel med html4.01 strict, men det er en småting, som forhåbentlig ikke vælter noget !o]
Ups, jeg glemte helt at forholde mig til dit ønske om forklaring, men nielles artikler er med garanti bedre end min forståelse, så vend bare tilbage, når du har checket dem ud !-)
Nå ved du hvad jeg har aldrig fået tid til at tjekke op på noget. Men du virker til at have godt styr på det og det virkede jo umiddelbart det script du havde lavet. Så læg et svar så får du point.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.