Søg og erstat

7 views
Skip to first unread message

Kurt Hansen

unread,
Jan 31, 2019, 4:01:03 AM1/31/19
to
Vi har et par webshops (mySQL database), hvor jeg igennem flere år har
forsømt at erstatte mellemrum i filnavne i stier med %20, når jeg
indsætter links i en tekst. Nu vil jeg gerne foretage en søg-og-erstat.

Eksempel:

<a href="http://danacord.com/res/anmeldelser/DACOCD 835 Politiken.jpg"

Stierne forekommer i flere varianter:

http://danacord.com/res/anmeldelser/
http://danacord.com/res/logo/
http://danacord.com/res/cover/

https://s3-eu-west-1.amazonaws.com/danacord.com/grafik/anmeldelser/
https://s3-eu-west-1.amazonaws.com/danacord.com/grafik/logo/
https://s3-eu-west-1.amazonaws.com/danacord.com/grafik/cover/

Det forekommer alt sammen i tabellen "products_description".
--
Venlig hilsen
Kurt Hansen

Jan Hansen

unread,
Jan 31, 2019, 6:34:29 AM1/31/19
to
Prøv med

UPDATE products_description SET products_description.linkfelt = REPLACE( products_description.linkfelt, ' ', '%20' );


--
mvh Jan.
Help Microsoft stamp out piracy. Give
Linux to a friend today!

Jan Hansen

unread,
Jan 31, 2019, 7:01:53 AM1/31/19
to
31 Jan 2019 12:34:27 +0100 skrev Jan Hansen <jhjjhj...@gmail.com>:

> Prøv med
>
> UPDATE products_description SET products_description.linkfelt = REPLACE( products_description.linkfelt, ' ', '%20' );

Det dur ikke, hvis der er tekst i samme felt som linket.

Bertel Lund Hansen

unread,
Jan 31, 2019, 7:04:46 AM1/31/19
to
Kurt Hansen skrev:

> Vi har et par webshops (mySQL database), hvor jeg igennem flere år har
> forsømt at erstatte mellemrum i filnavne i stier med %20, når jeg
> indsætter links i en tekst. Nu vil jeg gerne foretage en søg-og-erstat.

Mellemrum i filnavne har fanden skabt. Jeg bruger det aldrig i
filer der skal offentliggøres, og meget sjældent ellers.

--
/Bertel

Krabsen

unread,
Jan 31, 2019, 8:41:24 AM1/31/19
to
110% enig. Bruger det aldrig - som i ALDRIG!

Men det hjælper jo ikke Kurt lige nu, bortset fra at han nu formentlig
har lært lektien.

Martin Larsen

unread,
Jan 31, 2019, 6:01:59 PM1/31/19
to
Den 31/01/2019 kl. 10.01 skrev Kurt Hansen:

> Vi har et par webshops (mySQL database), hvor jeg igennem flere år har
> forsømt at erstatte mellemrum i filnavne i stier med %20, når jeg
> indsætter links i en tekst. Nu vil jeg gerne foretage en søg-og-erstat.

Du er nok nødt til at køre det igennem et php-script og lav regex-erstat
på indholdet. MySQLs regex er ikke avanceret nok til den slags.

Kurt Hansen

unread,
Feb 1, 2019, 2:57:12 AM2/1/19
to
Jeg har ingen forstand på databaser, så jeg kan ikke gennemskue hvordan
noget sådant kan gøres i praksis. Kan du skitsere det?

Krabsen

unread,
Feb 1, 2019, 6:10:02 AM2/1/19
to
Det kræver ikke regex - kan godt klares med php. Men det bliver en
kringlet kode, så bør afprøves på en kopi af basen (som alle ændringer i
koden bør :-) )

Martin Larsen

unread,
Feb 1, 2019, 3:16:03 PM2/1/19
to
Den 01/02/2019 kl. 12.10 skrev Krabsen:

> Det kræver ikke regex - kan godt klares med php. Men det bliver en
> kringlet kode, så bør afprøves på en kopi af basen (som alle ændringer i
> koden bør :-)  )

Jeg skriver jo også et php-script! Så ja, med php. Og lettest vha regex
(i php).

Og altid på en kopi af DB, det giver sig selv.

Martin Larsen

unread,
Feb 1, 2019, 3:18:54 PM2/1/19
to
Den 01/02/2019 kl. 08.57 skrev Kurt Hansen:

> Jeg har ingen forstand på databaser, så jeg kan ikke gennemskue hvordan
> noget sådant kan gøres i praksis. Kan du skitsere det?

- Kør hver post igennem i en løkke
- Søg efter de famøse mellemrum med fx preg_replace og erstat med %20
- Gem posten igen i en ny tabel products_description_ny
- Hvis alt ser ok ud, kan du omdøbe den gamle til
products_description_bak og den nye til products_description

Martin Larsen

unread,
Feb 1, 2019, 3:57:18 PM2/1/19
to
Den 01/02/2019 kl. 21.18 skrev Martin Larsen:

> - Søg efter de famøse mellemrum med fx preg_replace og erstat med %20

Jeg elsker regex (seriøst!) så nu har jeg lavet den del for dig:

<?php

$description = 'Blaba al <a style="color:blue"
href="http://danacord.com/res/anmeldelser/DACOCD 835 Politiken.jpg"> sdjksj
<a href="http://danacord.com/res/anmeldelser/DACOCD 835 Politiken.jpg">
daskj kdajadk s <a href="http://danacord.com/res/anmeldelser/DACOCD 835
Politiken.jpg">
lkdsk dals <a href="http://danacord.com/res/anmeldelser/DACOCD 835
Politiken.jpg" class="myclass"> kdlk AD';

echo $description,"\n\n";

$description = preg_replace_callback('%<a
[^>]*href=(["\'])(.*?)\1[^>]*>%i', "callback", $description);

echo $description,"\n\n";

function callback($match) {
$tag = $match[0];
$url = $match[2];
if(strpos($url, " ") === false) {
return $tag; // gør intet hvis der ikke er mellemrum i url
}
$newurl = str_replace(" ", "%20", $url);
$newtag = str_replace($url, $newurl, $tag);
return $newtag;
}

?>

Regexet tager højde for forskellige udformninger af <a> taggen, fx case,
styles og classes, samt enkelt eller dobbelt citationstegn.

Krabsen

unread,
Feb 2, 2019, 2:52:49 AM2/2/19
to
Den 01-02-2019 kl. 21:16 skrev Martin Larsen:
> Den 01/02/2019 kl. 12.10 skrev Krabsen:
>
>> Det kræver ikke regex - kan godt klares med php. Men det bliver en
>> kringlet kode, så bør afprøves på en kopi af basen (som alle ændringer
>> i koden bør :-)  )
>
> Jeg skriver jo også et php-script! Så ja, med php. Og lettest vha regex
> (i php).
>
Jeps.

Det jeg mente var, at for uøvede udi regex (som mig selv :-( ) vil det
også kunne klares via 'læsbare' php-kommandoer som strpos() etc.

Der er ikke noget galt med preg_replace_callback(), men læsbar for
begyndere er den ikke - den minder lidt om et gammelt APL-program, hvis
nogle kan huske dem!

Martin Larsen

unread,
Feb 2, 2019, 5:02:16 AM2/2/19
to
Den 02/02/2019 kl. 08.52 skrev Krabsen:

> Det jeg mente var, at for uøvede udi regex (som mig selv :-( )  vil det
> også kunne klares via 'læsbare' php-kommandoer som strpos()

Jeg tror det bliver meget svært uden regex at tage hensyn til de
forskellige variationer der kan være.

Regex er heller ikke ufejlbarligt. Det bedste er i virkeligheden DOM
parsing.

Du har i øvrigt ret i at regex ikke er læsbart. Derfor kalder man det
også i spøg et write-only sprog!

Kurt Hansen

unread,
Feb 3, 2019, 1:50:10 AM2/3/19
to
Den 01/02/2019 kl. 21.57 skrev Martin Larsen:
> Den 01/02/2019 kl. 21.18 skrev Martin Larsen:
>
>> - Søg efter de famøse mellemrum med fx preg_replace og erstat med %20
>
> Jeg elsker regex (seriøst!) så nu har jeg lavet den del for dig:
>
> <?php
>
> $description = 'Blaba al <a style="color:blue"
Imponerende, men sort for mig. Du skriver "den del" ... det vil altså
sige at der også skal noget andet til?

Jeg ved ikke engang hvordan man afvikler et php-script i en database.
Databasen ligger på et webhotel og tilgås via dets kontrolpanel.

Kurt Hansen

unread,
Feb 3, 2019, 1:53:13 AM2/3/19
to
Hvorfor? Alle operativsystemer har vel understøttet det i mange år?

Bertel Lund Hansen

unread,
Feb 3, 2019, 3:25:14 AM2/3/19
to
Kurt Hansen skrev:

> Hvorfor? Alle operativsystemer har vel understøttet det i mange år?

Jo, men Windows har lavet det via et trick som er videreført i
Windows 10 (8+3-filnavnene kan stadig findes, og det er dem der
bruges internt i systemet), og i alle operativsystemer er man
nødt til at bruge anførselstegn om filnavne der indeholder
mellemrum. Det er en kilde til evig irritation - og fejl.

Et filnavn er en enhed og bør ikke splittes af et element der
netop bruges til at holde forskellige elementer adskilt.

Jeg kan godt forstå den ukyndige bruger der synes at "Susi og
Leos sidste nye cd" er et logisk filnavn, men det kunne man
hurtigt lære at holde op med når man fik at vide at:

Ukendt parameter: og

--
/Bertel

Krabsen

unread,
Feb 3, 2019, 3:49:44 AM2/3/19
to
Åbenbart ikke, for så havde du jo ikke behov for at gå ind og pille i
databasen? ;-)

Krabsen

unread,
Feb 3, 2019, 3:55:34 AM2/3/19
to
Hvis du ikke har begreb om opbygning og afvikling af php-scripts, har du
tre alternativer:

1. Ret det hele manuelt via webhotellets kontrolpanel.

2. Betal en programmør for en opgave, du ikke selv har kompetencer til løse.

3. Lev med det, hvis det har fungeret i flere år. If it ain't broke,
don't fix it.

Bertel Lund Hansen

unread,
Feb 3, 2019, 5:16:17 AM2/3/19
to
Krabsen skrev:

> Åbenbart ikke, for så havde du jo ikke behov for at gå ind og pille i
> databasen? ;-)

Touché!

--
/Bertel

Kim Ludvigsen

unread,
Feb 3, 2019, 6:43:59 AM2/3/19
to
Men har han behov for at ændre det?

Kurt, har du oplevet problemer, eller er det bare fordi, du har hørt, at
man bør bruge %20 i stedet for mellemrum?

Personligt har jeg brugt bindestreger til alt på nettet, men jeg er
faktisk lige gået væk fra det, når det drejer sig om tags på min
rejseside. Jeg har ikke oplevet bivirkninger ved det, men har derimod
kunnet glæde mig over, at der ikke længere er problemer med ord, hvor
der /skal/ være bindestreg, fx "ø-ferie".

Og apropos, så er jeg også begyndt at bruge æ, ø og å i tag'ene i stedet
for at omskrive med ae, oe og aa - det har også lettet en del, fordi der
ikke længere skal tages højde for tags som fx "san saeb" og "isaan".

Jeg kan ikke afvise, at det kan give problemer, hvis jeg en dag skifter
webhotel, men indtil nu virker det tilsyneladende helt fint.

--
Mvh. Kim Ludvigsen

Kurt Hansen

unread,
Feb 3, 2019, 8:45:36 AM2/3/19
to
Den 03/02/2019 kl. 12.43 skrev Kim Ludvigsen:
> Den 03/02/2019 kl. 17.16 skrev Bertel Lund Hansen:
>> Krabsen skrev:
>>
>>> Åbenbart ikke, for så havde du jo ikke behov for at gå ind og pille i
>>> databasen? ;-)
>>
>> Touché!

> Men har han behov for at ændre det?
>
> Kurt, har du oplevet problemer, eller er det bare fordi, du har hørt, at
> man bør bruge %20 i stedet for mellemrum?

Naj, jeg har ikke oplevet problemer, men vil netop ændre det for at være
"korrekt".

Bertel Lund Hansen

unread,
Feb 3, 2019, 12:13:38 PM2/3/19
to
Kim Ludvigsen skrev:

> Personligt har jeg brugt bindestreger til alt på nettet,

Jeg bruger understreg. Det ligner et mellemrum.

Og når jeg programmerer, dur bindestreger ikke, og det er nemmest
at have faste vaner.

--
/Bertel

Kim Ludvigsen

unread,
Feb 3, 2019, 12:25:45 PM2/3/19
to
Den 04/02/2019 kl. 00.13 skrev Bertel Lund Hansen:
> Kim Ludvigsen skrev:
>
>> Personligt har jeg brugt bindestreger til alt på nettet,
>
> Jeg bruger understreg. Det ligner et mellemrum.

Jeg startede med understreg i URL'er af samme grund, det ser meget
pænere ud i adressefeltet i en browser. Men Google fortalte på et
tidspunkt, at de skelnede mellem bindestreg og understreg, og at
bindestreg var bedst for rankingen. Det har muligvis ændret sig siden,
men jeg skiftede dengang til bindestreger i URL'er.

--
Mvh. Kim Ludvigsen

Martin Larsen

unread,
Feb 4, 2019, 10:39:06 AM2/4/19
to
Den 03/02/2019 kl. 07.50 skrev Kurt Hansen:

> Du skriver "den del" ... det vil altså sige at der også skal noget andet
> til?

Ja, fra mit forrige indlæg:

- Kør hver post igennem i en løkke
- Søg efter de famøse mellemrum med fx preg_replace og erstat med %20
- Gem posten igen i en ny tabel products_description_ny
- Hvis alt ser ok ud, kan du omdøbe den gamle til
products_description_bak og den nye til products_description

Det jeg har løst for dig nu er punkt 2.

Martin Larsen

unread,
Feb 7, 2019, 7:33:53 AM2/7/19
to
Den 04/02/2019 kl. 16.39 skrev Martin Larsen:

> Det jeg har løst for dig nu er punkt 2.

Sig til hvis du skal sparkes i gang med resten :)

Kurt Hansen

unread,
Feb 8, 2019, 1:21:52 AM2/8/19
to
Det ville jeg ikke selv have spurgt/bedt om, men når du nu selv tilbyder
det, så siger jeg da tak :-)

Jan Hansen

unread,
Feb 8, 2019, 8:38:18 AM2/8/19
to
8 Feb 2019 07:21:51 +0100 skrev Kurt Hansen <ku...@invalid.dk>:

> > Sig til hvis du skal sparkes i gang med resten :)
>
> Det ville jeg ikke selv have spurgt/bedt om, men når du nu selv tilbyder
> det, så siger jeg da tak :-)

Når Martin Larsen har lavet det svære, er resten vel til at overse.
Hvis du udfylder $tabel, $felt og $forbindelse korrekt, kan dette lave
en tabel "nytabel" med rettet indhold af den originale.
Kommer der ingen fejl - formentlig timeout - vil der stå
"Tabellen er fremstillet." herefter kan den omdøbes til originalt navn.

<?php
$tabel='products_description';
$felt='products_description';
$forbindelse = mysqli_connect("server", "login", "password", "database") or die ("Der er ged i dine login oplysninger.");

$x = mysqli_query($forbindelse,"CREATE TABLE nytabel LIKE `$tabel`") or die ("nytabel findes eller $tabel findes ikke");
$x = mysqli_query($forbindelse,"INSERT nytabel SELECT * FROM `$tabel`") or die ("Dur ikke 1");
$x = mysqli_query($forbindelse,"SELECT `$felt` FROM nytabel") or die ("Dur ikke 2");
while ($t = mysqli_fetch_array($x)) {
$gammel=$t["$felt"];
$ny = preg_replace_callback('%<a [^>]*href\s*=\s*(["\'])(.*?)\1[^>]*>%i', "callback", $gammel);
$ny = preg_replace_callback('%<img [^>]*src\s*=\s*(["\'])(.*?)\1[^>]*>%i', "callback", $ny);
if ($gammel!==$ny) {
$gammel = mysqli_real_escape_string($forbindelse, $gammel);
$ny = mysqli_real_escape_string($forbindelse, $ny);
$y=mysqli_query($forbindelse,"UPDATE nytabel SET `$felt` = '$ny' WHERE `$felt` = '$gammel'") or die ("Dur ikke 3");
}
}
echo 'Tabellen er fremstillet. <br>
Ser det rigtigt ud, så skriv <br>
RENAME '.$tabel.' TO '.$tabel.'_backup; <br>
RENAME nytabel TO '.$tabel.';';

function callback($match) {
$tag = $match[0];
$url = $match[2];
if(strpos($url, " ") === false) {
return $tag; // gør intet hvis der ikke er mellemrum i url
}
$newurl = str_replace(" ", "%20", $url);
$newtag = str_replace($url, $newurl, $tag);
return $newtag;
}

?>


Martin Larsen

unread,
Feb 9, 2019, 11:04:28 AM2/9/19
to
Den 08/02/2019 kl. 14.38 skrev Jan Hansen:

> CREATE TABLE nytabel LIKE `$tabel`

Fantastisk! Nu har jeg arbejdet professionelt med MySQL 20 år, og jeg
har ikke set den syntaks før nu.

Ganske nyttigt.

Reply all
Reply to author
Forward
0 new messages