Avatar billede cyfer Nybegynder
12. september 2008 - 15:58 Der 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

Levering til:
Navn: Et andet navn

Produkt: Testprodukt
##-----------------------------##

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...
Avatar billede wanze Nybegynder
12. september 2008 - 19:34 #1
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.
Avatar billede cyfer Nybegynder
13. september 2008 - 00:27 #2
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?
Avatar billede roenving Novice
13. september 2008 - 08:34 #3
Et eksempel skrevet i java script:

<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 !-)
Avatar billede roenving Novice
13. september 2008 - 08:37 #4
-- og for at dække forskelle på styre-systemer, skal udtrykket [\r\n] sandsynligvis efterstilles et + begge steder:

[\r\n]+
Avatar billede cyfer Nybegynder
13. september 2008 - 12:29 #5
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...?
Avatar billede roenving Novice
13. september 2008 - 12:41 #6
Nej, når du får det f.eks. fra clipboardet eller fra noget andet, så vil f.eks.

Dette er en tekst
-- og den er i flere linjer

Se således ud i baggrundskoden (windows !-):

Dette er en tekst\r\n-- og den er i flere linjer

-- så du skal ikke indsætte noget, de er der i forvejen, men linjeskift-tegnene vil bare være tolkede af det, der fremviser det !o]
Avatar billede cyfer Nybegynder
13. september 2008 - 14:49 #7
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?
Avatar billede roenving Novice
13. september 2008 - 15:07 #8
Ja, det kan du godt ...
Avatar billede cyfer Nybegynder
14. september 2008 - 15:48 #9
Kan jeg få et eksempel? :)
Jeg er overhovedet ikke stærk i javascript..
Avatar billede roenving Novice
14. september 2008 - 20:31 #10
...

<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>

...

<textarea id="minTekstbox">Indsæt tekst</textarea><br>
<button onclick="showExtractedValues();return false;">Udtræk relevante værdier</button>

-- men det kræver så, at formatteringen holder, som du skriver i dit spørgsmål !-)
Avatar billede cyfer Nybegynder
15. september 2008 - 00:20 #11
Hmmmm .... Der sker intet ved tryk på knappen....

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?
Avatar billede roenving Novice
15. september 2008 - 16:21 #12
Tjah, måske var jeg lidt hurtig (og doven !-)

Sådan skal scriptet se ud:

<script type="text/javascript">
function showExtractedValues(){
  var x = document.getElementById("minTekstbox").firstChild;
  var reg = /:([^\r\n]*?)[\r\n]/gm
  var txt = (x.nodeValue+"\n").match(reg);
  txt = txt.join("").replace(/:[\r\n]+/g,"").replace(/[\r\n]+/g,"; ").replace(/:\s/g,"");
  x.nodeValue = txt.replace(/; $/,"").replace(/;.*?;/,";");
}
</script>
Avatar billede cyfer Nybegynder
15. september 2008 - 18:49 #13
Hehe det er okay... Det virker dog stadig ikke :)
http://devcore.dk/script.html

Og fulgte der en lille forklaring med til hvad det er du gør i scriptet?
Avatar billede roenving Novice
16. september 2008 - 16:18 #14
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]
Avatar billede cyfer Nybegynder
16. september 2008 - 19:23 #15
Hmm okay my bad.. Prøvede lige i internet explorer og der virker det fint nok.. Virker bare ikke i alt andet..

Anyways jeg vil gerne have forklaring på resten også hvis du gider. Smid det bare som et svar så får du point.
Avatar billede roenving Novice
16. september 2008 - 21:27 #16
regExps er en helt speciel sammenhæng, du kan med fordel finde de artikler, nielle har skrevet om det: http://www.eksperten.dk/artikler/index.phtml?users=nielle !-)

-- 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]
Avatar billede roenving Novice
16. september 2008 - 21:29 #17
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 !-)
Avatar billede cyfer Nybegynder
13. november 2008 - 20:05 #18
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.
Avatar billede roenving Novice
14. november 2008 - 09:10 #19
Oki '-)
Avatar billede cyfer Nybegynder
14. november 2008 - 11:45 #20
And here you go. Tak for hjælpen :)
Avatar billede roenving Novice
15. november 2008 - 10:23 #21
-- og jeg takker for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester