Avatar billede proviben Novice
30. april 2005 - 09:50 Der er 43 kommentarer og
1 løsning

$str = str_replace funktion

Hvordan strippes et link således, at en eventuel mappestruktur ell. subdomæne fjernes?

http://www.enwebside.com/etellerandetdir/ --->  http://www.enwebside.com

http://sub.enwebside.com/etellerandetdir/ --->  http://www.enwebside.com
Avatar billede nielle Nybegynder
30. april 2005 - 10:15 #1
eregi_replace
(
'http://[\w\d]+\.([\w\d\.]+)\S*',
'hhtp://www.\\1',
$str
);
Avatar billede proviben Novice
30. april 2005 - 10:37 #2
Hvordan får jeg det lige med i følgende kontekst?

<?php

$mappe = 'mappeind';

$d = opendir( $mappe );
while ( $file = readdir( $d ) )
{
if ( is_file( "$mappe/$file" ) && substr( $file, -4 ) == '.htm' )
{
$str = implode( '', file( "$mappe/$file" ) );


$str = str_replace('/\s+/', '', $str);


$fp = fopen( "$mappe/$file", 'w' );
fwrite( $fp, $str );
fclose( $fp );
}
}
closedir( $d );

?>
Avatar billede nielle Nybegynder
30. april 2005 - 10:47 #3
<?php
$mappe = 'mappeind';

$d = opendir( $mappe );
while ( $file = readdir( $d ) )
{
    if ( is_file( "$mappe/$file" ) && substr( $file, -4 ) == '.htm' )
    {
        $str = implode( '', file( "$mappe/$file" ) );

        $str = str_replace('/\s+/', '', $str);

        $str = eregi_replace('http://[\w\d]+\.([\w\d\.]+)\S*', 'hhtp://www.\\1', $str);

        $fp = fopen( "$mappe/$file", 'w' );
        fwrite( $fp, $str );
        fclose( $fp );
    }
}
closedir( $d );
?>
Avatar billede nielle Nybegynder
30. april 2005 - 10:48 #4
Og hhtp: skal selvfølgelig loige rettes til http:
Avatar billede nielle Nybegynder
30. april 2005 - 10:49 #5
Info om eregi_replace:

http://dk.php.net/eregi_replace
Avatar billede proviben Novice
30. april 2005 - 11:26 #6
Det virker tilsyneladende ikke, - alle links henstår urørt.
Avatar billede nielle Nybegynder
30. april 2005 - 11:34 #7
Måske kan PHP ikke lide \S (som normalt betyder "alt andet end whitespace"). Prøv denne her i stedet:

$str = eregi_replace(
'http://[\w\d]+\.([\w\d\.]+)[\/\w\d]*',
'http://www.\\1',
$str);
Avatar billede proviben Novice
30. april 2005 - 11:55 #8
Desværre, samme nedslående resultat.
Avatar billede nielle Nybegynder
30. april 2005 - 12:01 #9
$str = eregi_replace(
'http://[a-z0-9]+\.([a-z0-9\.]+)[\/a-z0-9]*',
'http://www.\\1',
$str);
Avatar billede nielle Nybegynder
30. april 2005 - 12:02 #10
Jeg er vant til at arbejde med regexp i andre sammenhænge - måske virker \w og \d simpelthen bare ikke i PHP.
Avatar billede ranglen Nybegynder
30. april 2005 - 12:11 #11
for at bruge \d \w .. skal du have fat i preg_replace

\w inkluderer også [0-9]
Avatar billede olebole Juniormester
30. april 2005 - 12:29 #12
<ole>

Faktisk er det lidt en gåde, hvordan ereg-funktionerne nogensinde endte i PHP - og hvorfor i alverden de stadig eksisterer.
preg-funktionerne er betydelig hurtigere - og så holder de sig til Perl-RegExp syntaksen, der vel er den mest udbredte  :)

/mvh
</bole>
Avatar billede nielle Nybegynder
30. april 2005 - 12:41 #13
Jamen så prøver vi da med preg_replace (http://dk.php.net/preg_replace):

$str = preg_replace(
"http://\w+\.([\w\.]+)[\/\w]+",
"http://www.\$1",
$str);
Avatar billede proviben Novice
30. april 2005 - 12:57 #14
Nu slettes indholdet helt!
Avatar billede tagman Nybegynder
30. april 2005 - 13:03 #15
$str = preg_replace("/^http:\/\/.*?\//i", "", $str);

Hermed går jeg altså ud fra, at alt fra og med http:// og til og med førstkommende / skal slettes.
Avatar billede nielle Nybegynder
30. april 2005 - 13:05 #16
Der manglede et /-/ par rundt om møsteret.

$str = preg_replace(
"/http://\w+\.([\w\.]+)[\/\w]+/",
"http://www.\$1",
$str
);
Avatar billede nielle Nybegynder
30. april 2005 - 13:07 #17
...og så skulle /-tegnene også lige escapes:

$str = preg_replace(
"/http:\/\/\w+\.([\w\.]+)[\/\w]+/",
"http://www.\$1",
$str
);
Avatar billede tagman Nybegynder
30. april 2005 - 14:12 #18
Arrh pis... læste forkert, så det var et fuldstændig ligegyldigt pattern jeg gav. Her er et nyt:

"/^(http:\/\/w?w?w?\.?).*?(\w+\.[a-z]{2,}\/).*$/i", "$1$2"
Avatar billede tagman Nybegynder
30. april 2005 - 14:22 #19
nielle > Dit pattern er case sensitive og vil putte "www" foran alle domæner uanset hvad.
Avatar billede proviben Novice
30. april 2005 - 14:30 #20
Virker ikke, - giver følgende output:

$str = preg_replace("/http:\/\/\w+\.([\w\.]+)[\/\w]+/","http://www.\$1",$str);
--->
<p><a href="http://www.test.d">http://www.test.d</a></p>
<p><a href="http://www.test.dk">http://www.test.dk</a></p>

$str = preg_replace("/^(http:\/\/w?w?w?\.?).*?(\w+\.[a-z]{2,}\/).*$/i", "$1$2",$str);
--->
<p><a href="http://www.test.dk">http://www.test.dk</a></p>
<p><a href="http://sub.test.dk/test">http://www.test.dk/test</a></p>

##test fil
<p><a href="http://www.test.dk">http://www.test.dk</a></p>
<p><a href="http://sub.test.dk/test">http://www.test.dk/test</a></p>
##
Avatar billede nielle Nybegynder
30. april 2005 - 14:48 #21
tagman>

Ja, case-sensitivt på "http" - men ikke på resten: \w matcher a-zA-Z0-9_

Ja, der sættes "www" ind foran alle domæer, men det var no også hvad proviben bad om. Se eksempel 2 i det oprindelige spørgsmål.
Avatar billede nielle Nybegynder
30. april 2005 - 14:54 #22
Hvis:

<p><a href="http://www.test.dk">http://www.test.dk</a></p>
<p><a href="http://sub.test.dk/test">http://www.test.dk/test</a></p>

- er dit input, så er:

<p><a href="http://www.test.d">http://www.test.d</a></p>
<p><a href="http://www.test.dk">http://www.test.dk</a></p>

- da også det rigtige output. Ellers er der noget galt med spørgsmålet?
Avatar billede nielle Nybegynder
30. april 2005 - 14:56 #23
Og så måske ikke helt. Det sidste '+' skulle jo nok have været et '*':

$str = preg_replace(
"/http:\/\/\w+\.([\w\.]+)[\/\w]*/i",
"http://www.\$1",
$str
);
Avatar billede proviben Novice
30. april 2005 - 14:58 #24
Nej, der mangler et "k" i dk
Avatar billede nielle Nybegynder
30. april 2005 - 15:01 #25
Jep, den skulle være rettet med det seneste pattern (som også er 100% case-insesitiv ;^).
Avatar billede tagman Nybegynder
30. april 2005 - 15:20 #26
proviben:

Har selv testet min sætning, og den virkede fint. Du kan evt. fjerne min lazy star, så du får dette pattern:

"/^(http:\/\/w?w?w?\.?).*(\w+\.[a-z]{2,}\/).*$/i", "$1$2"

Ellers virker det altså fint. Det kan da også godt være, du har mærkelig tegn i starten af dine URLs, i så fald, så prøv:

"/.*?(http:\/\/w?w?w?\.?).*?(\w+\.[a-z]{2,}\/).*$/i", "$1$2"
Avatar billede proviben Novice
30. april 2005 - 16:13 #27
$str = preg_replace("/http:\/\/\w+\.([\w\.]+)[\/\w]*/i","http://www.\$1",$str);
-->
<p><a href="http://www.test.dk">http://www.test.dk</a></p>
<p><a href="http://www.test.dk">http://www.test.dk</a></p>

- fint,  men testet med flere regulære links, så fås fx også følgende output

http://www.test.dk-side.php/

+

http://www.test.dk-side.asp/



"/.*?(http:\/\/w?w?w?\.?).*?(\w+\.[a-z]{2,}\/).*$/i", "$1$2"
-->
<p><a href="http://www.test.dk">http://www.test.dk</a></p>
http://test.dk/

- mangler bla.: <p><a href="http://www

"/^(http:\/\/w?w?w?\.?).*(\w+\.[a-z]{2,}\/).*$/i", "$1$2"
-->
<p><a href="http://www.test.dk">http://www.test.dk</a></p>
<p><a href="http://sub.test.dk/test">http://www.test.dk/test</a></p>

- indeholder "sub"
Avatar billede nielle Nybegynder
30. april 2005 - 16:38 #28
Hvus den også skal kunne håndtere '-': så er det:

$str = preg_replace(
"/http:\/\/[\w-]+\.([\w\.-]+)[\/\w-]*/i",
"http://www.\$1",
$str
);
Avatar billede proviben Novice
30. april 2005 - 16:56 #29
Bedre, men stadig lidt problematisk, fx følgende output:

http://www.test.dk.cgi/get=22

http://www.test.dk.cfm/
Avatar billede nielle Nybegynder
30. april 2005 - 17:02 #30
Jeg kan ikke umiddelbart se hvad der skulle være i vejen med den sidste af de to? Men denne her variant kan da klare både '%' og '=':

$str = preg_replace(
"/http:\/\/[\w-]+\.([\w\.-]+)[\/\w%=-]*/i",
"http://www.\$1",
$str
);
Avatar billede proviben Novice
30. april 2005 - 17:09 #31
Samme resultat, i øvrigt så er der flere typer fx:

http://www.test.dk.html/
Avatar billede nielle Nybegynder
30. april 2005 - 17:14 #32
Hvad forventer du da at "http://www.test.dk.html/" skal blive til?
Avatar billede nielle Nybegynder
30. april 2005 - 17:17 #33
Det ville være en hjælp hvis du vise **både** indput, output, og det output som du gerene vil have.
Avatar billede nielle Nybegynder
30. april 2005 - 17:26 #34
$str = preg_replace(
"/http:\/\/[\w-]+\.([\w\.-]+)[\/\w\.%=-]*/i",
"http://www.\$1",
$str
);
Avatar billede proviben Novice
30. april 2005 - 17:38 #35
Sidste eksempel er super, fandt dog en enkelt svipser:

http://www.test.dk/?partner=78
Avatar billede tagman Nybegynder
30. april 2005 - 17:44 #36
^(http:\/\/w?w?w?\.?).*?([\w-]+\.[a-z]{2,}\/).*$

Bindestreg tilføjet. Den her virker altså. Jeg gider ikke hjælpe mere. Har testet den til døde nu. Tag og forklar dig selv noget bedre, proviben, eller lær selv de dér regulære udtryk... det er faktisk en god ide!
Avatar billede nielle Nybegynder
30. april 2005 - 17:45 #37
$str = preg_replace(
"/http:\/\/[\w-]+\.([\w\.-]+)[\/\w\.\?%=-]*/i",
"http://www.\$1",
$str
);
Avatar billede nielle Nybegynder
30. april 2005 - 17:49 #38
tagman> Så vidt jeg ved så betyder et '^' i starten at den skal matche på starten af linjen. Så hvordan skulle den lige kunne klare at forvandle:

<p><a href="http://sub.test.dk/test">http://www.test.dk/test</a></p>

- til:

<p><a href="http://www.test.dk">http://www.test.dk</a></p>

proviben> Som tagman siger, lær at bruge regulære udtryk. Det er ikke en investering i tid som du vil fortryde!
Avatar billede nielle Nybegynder
30. april 2005 - 17:52 #39
Iøvrigt vil din afsluttende '.*' "æde" alt hvad der kommer efter og det er jo ikke så¨god en ide hvis urlet, ligger i en større tekst - og det synes jeg nu nok at eksemplerne 30/04-2005 14:30:21 antyder at de gør.
Avatar billede tagman Nybegynder
30. april 2005 - 18:05 #40
Jamen det var jo det jeg ikke forstod... det liger sjusket copy-paste af noget html...
Avatar billede proviben Novice
30. april 2005 - 18:06 #41
Nu virker det, - tak for hjælpen nielle! Smid lige et svar.

Jeg har i forvejen kogt teksten ned via en anden str_replace funktion. Slutteligt, så har jeg nu testet det på opimod 300 links. Øjensynligt, så er outputtet helt fejlfrit.
Avatar billede nielle Nybegynder
30. april 2005 - 18:10 #42
Det fremgår af 30/04-2005 10:37:17 at det er htm-filer der skal behandles.
Avatar billede nielle Nybegynder
30. april 2005 - 18:22 #43
Så kom vi endeligt i mål :^)

Blot en enkelt ting; Nu bliver "http://sub.etdomæne.dk" altså rettet til "http://www.etdomæne.dk"; Sådan ville du jo have det, men jeg ret sikker på at det ikke er nogen særlig god ide. Det er nemlig slet ikke givet at "http://www.etdomæne.dk" overhovedet er et url som er brugbart. "www" er nemlig blot et subdomæne på webserveren, og det er slet ikke givet at det eksistere.

En anden type URLs som også giver problemer er den på formen "http://etdomæne.dk".

Jeg mener at det ville være en god ide at du besluttede dig for at sub-domæent ikke skulle "anonymiseres" til "www". Den løsning ser sådan her ud:

$str = preg_replace(
"/hhtp:\/\/([\w\.\-]+)[\/\w\.\?%=-]*/i",
"http://\$1",
$str
);
Avatar billede proviben Novice
30. april 2005 - 20:16 #44
Set i bakspejlets ulidelige klare skær, - så bør jeg jo nok undlade en sådan www-anonymisering. Tak for det ekstra indspil!
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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