Avatar billede phpwiz Nybegynder
26. december 2003 - 15:30 Der er 10 kommentarer og
1 løsning

regexp, opfører sig underligt

Jeg sidder og er ved at sætte mig ind i regexp vha. preg.

har lavet dette lille script hvor jeg prøver at gå frem og vil have et url om til et link. jeg søger ikke svaret på det hele, men kun hvorfor den opfører sig som den gør :

<SCRIPTET>
<?php
function makeLinksurl($url) {
    $x = preg_replace("/(http:\/\/)?/i","sjov",$url);
    return $x;
}
echo makeLinksurl("hej min hjemmeside er http://net.phpwiz.dk");
?>
</SCRIPTET>

den udskriver det :
sjovhsjovesjovjsjov sjovmsjovisjovnsjov sjovhsjovjsjovesjovmsjovmsjovesjovssjovisjovdsjovesjov sjovesjovrsjov sjovsjovwsjovwsjovwsjov.sjovrsjovasjovmsjovlsjovesjovvsjov.sjovdsjovksjov

det var meningen at den skulle bytte http:// ud med "sjov" og så ellers skrive resten ud igen, men den skriver sjov efter hvert bogstav i hele balladen

any1 ?
Avatar billede jakoba Nybegynder
26. december 2003 - 15:39 #1
tegnet '?' betyder  'nul gange eller een gang'  så
    "/(http:\/\/)?/i"
matcher 2 mulige strenge:
    "http://"
eller
    ""  (dvs ingenting) og ingenting finder den imellem hvert eneste bogstav i den sreng du giver den. aå 'sjov' bliver skrevet ind imellem hvert eneste bogstav..
Avatar billede phpwiz Nybegynder
26. december 2003 - 15:41 #2
ahh, tak,

har lavet det om til

"/(http:\/\/){1}/i" istedet.
Avatar billede squashguy Nybegynder
26. december 2003 - 15:43 #3
"/http:\/\//i"

burde være nok
Avatar billede phpwiz Nybegynder
26. december 2003 - 15:54 #4
så er jeg kommet lidt længere :

$x = preg_replace("/(http:\/\/)(.+)?\.(.+)\.([a-z]{2,5})/i","<a href=\"$1$2.$3.$4\">$1$2.$3.$4</a>",$url);

den virker fint med url's af formatet http://www.xxx.yyy

men hvis det er http://xxx.yyy så virker den ikke, hvad gør jeg forkert ? ...
og ser det helt håbløst ud ?
Avatar billede squashguy Nybegynder
26. december 2003 - 16:03 #5
prøv denne

<?php
function makeLinksurl($url) {
    $x = preg_replace("/(http:\/\/[^\s]*)/i","<a href=\"$1\">$1</a>",$url);
    return $x;
}
echo makeLinksurl("hej min hjemmeside er http://net.phpwiz.dk hvad er din? http://google.dk test");
?>
Avatar billede phpwiz Nybegynder
26. december 2003 - 16:07 #6
hmm, skal lige se om jeg har forstået den rigtigt,
den tager http:// og herefter _alt_ herefter som ikke er mellemrum ? og laver til et link ?
Avatar billede squashguy Nybegynder
26. december 2003 - 16:09 #7
ja. \s = whitespace dvs mellemrum,tab,linieskift..
Avatar billede phpwiz Nybegynder
26. december 2003 - 16:09 #8
den vil også sige at : http://www er et link.
Avatar billede jakoba Nybegynder
26. december 2003 - 16:12 #9
jeg forstår ikke leddet  '(.+)'  det betyder 'ethvert tegn 1 til mange gange' og vil medtage punktummer så resten af strengen bliver fundet der. med det resultat at der ikke er noget tilbage til resten af din regexp at finde.

prøv at udskifte det med:
              ([^.\/]+)        'alt undtagen '.' og '/'

så vil den match hvis domænet bestaå af præcis 3 led.

men den vil IKKE matche hvis der kun er 2 led fordi den så kræver et punktum allerforrest i domænet og det er ikke en mulig URL.

$x = preg_replace("/http:\/\/([^.\/]+\.)+[a-z]{2,5}/i","<a href=\"$0\">$0</a>",$url);

$0 er 'alt hvad jeg matcher uden hensyn til parenteser', så nu bruges parenteserne kun til at opdele i grupper af sammenhørende tegn.

nu bluver  "http://dom1.dom2.dom3.com"
matchet som:
    "http://"  matches af  http:\/\/
    "dom1."    matches af  ([^.\/]+\.)+        (første gang)
    "dom2."    matches af  ([^.\/]+\.)+        (anden gang)
    "dom3."    matches af  ([^.\/]+\.)+        (tredie gang)
    "com"      matches af  [a-z]{2,5}       

mvh JakobA
Avatar billede jakoba Nybegynder
26. december 2003 - 16:17 #10
men rigtigt som squashguy siger, vi skal også undgå at matche blanktegn (og vist også et par andre, såsom : og ? :

$x = preg_replace("/http:\/\/([^:\?\s.\/]+\.)+[a-z]{2,5}/i","<a href=\"$0\">$0</a>",$url);
Avatar billede phpwiz Nybegynder
26. december 2003 - 16:44 #11
tak det virker, og jeg tror jeg er ved at have forstået det.
squashguy hvis du vil have lidt del i points så smid et svar, så får i 15 hver
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