Avatar billede visto Guru
18. januar 2012 - 16:22 Der er 9 kommentarer og
1 løsning

Erstatte _ (underscore) med - (bindestreg) i bestemt mønster i mange filer på en gang

Jeg fandt via et tidligere spørgsmål http://www.eksperten.dk/spm/953458 ud af, at jeg med programmet Eclipse kan søge/erstatte efter bestemt mønster i et bestemt tilfælde, som spørgsmålet drejede sig om.

Kan programmet også erstatte alle _ med - når _ i linkhenvisninger i html-filer, i de tilfælde hvor linket har følgende struktur: <a href="..._...php">? Dvs. <a href="..._...php"> skal erstattes med <a href="...-...php"> hvor ... er forskellig fra link til link? Hvordan gør jeg det med Eclipse?

Det er vigtigt, at links af typen <a href="http://..." target="_blank"> ikke ændres, da jeg bruger disse til at linke eksternt, hvorimod den første type er til interne links.
Avatar billede Slettet bruger
18. januar 2012 - 18:34 #1
Jeg ved ikke om det kan gøres i et hug, hvis du har links med mere end en -, men det kan gentages indtil den siger den ikke fandt noget.

Så samme fremgangsmåde som du brugte fra din gamle tråd (se kommentar #4):
1) Containing text: <a href="([^>]*?)-([^>]*?)php">
2) ...
3) ...
4) With: <a href="$1_$2php">

Jeg bruger [^>]*? i stedet for .*?, for ellers ville den f.eks. ændre - i dette eksempel:
<a href="a-bc.html">xxx</a> <a href="abc.php">xxx</a>

Der er ikke taget højde for eventuelle linieskift, og det ved jeg ikke om du har behov for i dette tilfælde.

Skal det også virke med a-elementer der kan have flere attributter end blot href (og evt. ekstra white spaces mellem a og href)? Kan forstå det i så fald kun skal virke for dem der ikke har target="_blank" som attribut.
Avatar billede visto Guru
18. januar 2012 - 20:13 #2
Mange tak!

Jeg vil bestemt tro at de aller-allerfleste links befinder sig ubrudt i en linje (det er gamle Frontpage-filer, der er konverteret til nyt design, så det er ikke helt til at vide, hvordan koderne ser ud desangående, men mine stikprøver tyder på mestendels én linje). Og jeg har under alle omstændigheder tænkt mig at tjekke alle links efter endt operation, og så vil jeg jo opdage hvis noget ikke er gået som det skulle.

Det skal undtagelsesvis også virke med links, hvor der er class eller id og dermed noget whitespace inde i billedet, men da jeg bestemt mener at det hører til undtagelserne, er det måske også lettere at rette manuelt bagefter, end at bruge en masse tid på at få det med i "operationen". Jeg tvivler meget på, at der er links med ekstra whitespace mellem a og href.

Du har byttet rundt på _ og -. Det er _ der skal blive til -. Jeg går ikke ud fra, at det gør nogen forskel i forb.m. princippet i din opskrift, nævner det blot for en sikkerheds skyld.
Avatar billede Slettet bruger
18. januar 2012 - 21:12 #3
Det skulle ikke have nogen betydning at du bytter om på - og _.

Jeg kan se jeg ikke har taget højde for at du f.eks. har følgende:
<a href="..." UkendtAttribut="...php">
hvor der er en _ et eller andet sted i ...

Så hvis der er en risiko, ville jeg erstatte [^>] med [^>"]:
<a ([^>"]*?)href="([^>"]*?)_([^>"]*?)php"(.*?)>

Jeg tror det helt rigtige regulære udtryk kommer til at blive meget kompliceret, hvis den skal virke for alle a-elementer pånær dem med target som attribut, og jeg ville nok få lavet nogle fejl i den hvis jeg prøvede. :)

Det nemmeste er nok at gentage search/replace hvor du har id, class og evt. en kombination af begge for også at ændre disse. F.eks. dem der har id som ekstra attribut:
Containing text: <a id="[^>"]*?" href="([^>"]*?)_([^>"]*?)php">
Containing text: <a href="([^>"]*?)_([^>"]*?)php" id="[^>"]*?">
og det samme med class bagefter, og så tage de sidste manuelt. :)

Men du må lige teste det med nogle eksempler hvis du prøver, så du kan se om det virker rigtigt det jeg har skrevet.
Avatar billede visto Guru
19. januar 2012 - 16:48 #4
Jeg har nu testet:
<a ([^>"]*?)href="([^>"]*?)_([^>"]*?)php"(.*?)>
erstattes med
<a href="$1_$2php">

Det gør at xxx_yyy.php bliver til xxxphp.

Har jeg forstået rigtigt hvad jeg skal bruge som henh. search og replace?
Avatar billede Slettet bruger
19. januar 2012 - 20:54 #5
Her kommer endnu en lang kommentar (og en bedre løsning i sidste halvdel):

Nu har jeg også lige prøvet at teste det af, og en enkelt ting skulle rettes i regex til search:
<a ([^>]*?)href="([^>"]*?)_([^>"]*?)php"(.*?)>
hvor jeg før brugte [^">]*? i den første parantes. Her skulle den ikke udelukke både > og ", men kun >, så eventuelle attributter (som selvfølgelig gerne gør brug af ") bliver fundet før selve href-attributten.

De fire sæt parantesser i denne regex, skal du så have gendannet i din replace:
<a $1href="$2-$3php"$4>

Det fungerer med dette eksempel (og også uden id og class eller med ekstra attributter):
<a class="test" href="xxx_yyy.php" id="test">xxx</a>
Men den erstatter desværre også alle dine a-elementer som har target="_blank".

Et bedre løsningsforslag:

Her er en anden regex som skulle kunne erstatte alle a-elementer både med og uden id og class som attributter og uanset om de kommer før og efter, men hvis den indeholder andre attributter (f.eks. target), så sker der ikke noget med disse a-elementer.
Search:
<a((?:\s+id="[^>"]*?"\s*|\s+class="[^>"]*?"\s*)*?)\shref="([^>"]*?)_([^>"]*?)php"((?:\s+id="[^>"]*?"\s*|\s+class="[^>"]*?"\s*)*?)>
Replace:
<a$1 href="$2-$3php"$4>

Jeg har prøvet at teste det med forskellige kombinationer af id og class (før og efter href) og uden disse attributter, men jeg kan ikke give en 100% garanti for at det virker som det skal, så du må gerne tjekke om det virker fornuftigt.

Den skal køres flere gange som nævnt tidligere, i tilfælde af at du har links med mere end én _ i linket, men den siger til når den ikke finder mere.

Og hvis du vil have lidt forklaring til regex'en jeg har strikket sammen, må du bare sige til. :)
Avatar billede Slettet bruger
19. januar 2012 - 21:06 #6
Det hvor jeg har "[^>"]*?" kunne egentlig godt erstattes med ".*?", men det gør heller ikke nogen skade.

Jeg har i øvrigt ikke taget højde for hvis du har nogle attributter der bruger ' i stedet for ", så de links sker der ikke nogen ændring ved.
Avatar billede visto Guru
20. januar 2012 - 12:41 #7
Jeg havde kørt første forsøg inden dit sidste indlæg, og de stikprøver jeg har taget tyder kraftigt på, at det virker som det skal. Så mange tak for hjælpen, der sparer mig for uoverskuelige mængder af tid!

Jeg forstår ikke, hvad du mener med attributer, der bruger "i stedet for". Men det bruger jeg sikkert ikke, da jeg ikke har observeret problemer.

En ting jeg dog havde glemt at tage højde for var links med henvisning til anchors. De ender jo ikke på .php men på fx .php#NySide">, så disse links er selvfølgelig ikke rettet. Det drejer sig om et relativt begrænset antal links (62 links på 20 sider), så mon ikke det er hurtigere at jeg retter dem manuelt, når jeg foretager mit afsluttende link-tjek, end at du bruger tid på en ny "model" og jeg så derefter foretager endnu en tilretning?

Jeg er imponeret over det du har lavet...

Hvis du er begyndt at samle point, så læg venligst et svar.
Avatar billede Slettet bruger
20. januar 2012 - 18:42 #8
Det bliver ikke brugt så tit, men det hænder at der er nogle der bruger ' i stedet for ", hvilket også er også tilladt. F.eks.:
<a href='xxx.php'>
Men det lyder ikke som om det er et problem med den html kode du sidder med. :)

Med anchors tror jeg bare der skal tilføjes (?:#[>"]*?) efter php, så det virker både med og uden anchors. Men det har jeg ikke testet. Det kunne også tænkes der skulle tages højde for links med parametre, f.eks. .php?key=value. Men hvis du kan rette de sidste manuelt, så er det helt fint. :)

Pointene beholder du bare. Det var lærerigt at eksperimentere lidt mere med regex, og jeg er ikke en rigtig haj til det endnu, så det er muligt det kunne have været lavet mere simpelt.
Avatar billede visto Guru
21. januar 2012 - 14:00 #9
Prøvede lige med (?:#[>"]*?) tilføjet efter php, men den fandt ikke noget der matchede. Jeg retter bare manuelt. Der er ikke noget med php?key-value. Så jeg har klaret det der skal klares.

Jeg er da lidt nysgerrig efter at vide, hvordan du strikker de regex sammen, så hvis du synes du vil bruge tid på at skrive, læser jeg gerne.

Jeg kan iøvrigt tilføje, at hvis andre kommer i den situation at de vil ændre samtlige _ til - i interne links, så kan følgenede freeware-program klare den del af det, der har at gøre med ændre samtlige filnavne, også i undermapper, på én gang: 1-4a Rename: http://www.1-4a.com/rename/

Til evt. kommende læsere: Jeg tager point tilbage, som tolamaps ønsker det. Men hans svar ovenfor er overordentlig brugbare.
Avatar billede Slettet bruger
22. januar 2012 - 20:55 #10
Hvordan jeg strikker dem sammen, er primært på baggrund af den information jeg har fra Java's java.util.regex API, da det er mest der jeg bruger det (og der er lidt forskelle på regex alt efter hvor man bruger det). Og så kan jeg nemt eksperimentere med det i noget java kode.
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Og nogle gange kigger jeg også lidt på denne tutorial, for at lære lidt mere om de avancerede udtryk man kan lave (Tutorial), eller for at vide hvordan de laves med et bestemt sprog (Tools and Languages):
http://www.regular-expressions.info/


I det sidste eksempel i #5, har jeg brugt nogle af de simple udtryk jeg oftest plejer at bruge. Jeg bruger paranteser til at danne nogle grupper, som jeg ønsker at finde og erstatte med noget andet (de 4 grupper med $1-$4 i eclipse replace).
1) (?:X) betyder at det ikke bliver en sådan gruppe (en non-capturing group, men den bliver dog regnet med som en del af en anden gruppe pga de andre parantesser der omslutter den)
2) \s er selvfølgelig en whitespace character
3) [] bruges til at definere et sæt af tegn der må være i teksten, og med [^] et sæt af tegn der ikke må være der
4) X*? betyder at den skal finde så få matches af X som muligt (0 eller flere) frem til næste del af regex'en, hvor X* (også 0 eller flere) ville finde så mange som muligt, og det er man nok sjældent er interesseret i
5) X+ er det samme som X*, bortset fra den skal være der mindst en gang
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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