Avatar billede jl4511 Nybegynder
27. september 2007 - 22:29 Der er 15 kommentarer og
1 løsning

Lave anker-links til headers i tekst

Jeg spekulerer på om følgende kan løses via regexp?

Vi har en vilkårlig tekst med et antal headers (h1, h2, h3).
Jeg vil have returneret en array med disse headers plus anker-linket, samt indsat ref'en til links'ne i teksten.

Er der nogen der kan løse den?
Avatar billede nielle Nybegynder
27. september 2007 - 22:33 #1
Hvilket progameringssprog?
Avatar billede jl4511 Nybegynder
27. september 2007 - 22:34 #2
Sorry - PHP
Avatar billede nielle Nybegynder
27. september 2007 - 22:51 #3
Et bud:

$htmlCode = "...";

$anchorNumber = 0
$anchorLinks = array();

$htmlCode = preg_replace_callback(
    "#(<h[1-3]>)([^<>]*)(</h[1-3]>)#ig",
    processAnchor(
        $anchorNumber++;
        $ancherName = "h$anchorNumber";

        $anchorLinks[] = "<a href='#$ancherName'>$2</a>";

        return "<a name='$ancherName'></a>$1$2$3";
    ),
    $htmlCode
);
Avatar billede nielle Nybegynder
27. september 2007 - 23:09 #4
Hmmm, ideen var god nok - men koden (%¤#&!?)...


Sådan:

$htmlCode = "...";

$anchorNumber = 0
$anchorLinks = array();

function processAnchor($matches) {
    $anchorNumber++;
    $ancherName = "h$anchorNumber";

    $anchorLinks[] = "<a href='#$ancherName'>" . $matches[2] . "</a>";

    return "<a name='$ancherName'></a>" . $matches[1] . $matches[2] . $matches[3];
)

$htmlCode = preg_replace_callback(
    "#(<h[1-3]>)([^<>]*)(</h[1-3]>)#ig",
    "processAnchor",
    $htmlCode
);
Avatar billede jl4511 Nybegynder
27. september 2007 - 23:28 #5
Fantastisk!!
Det ser ud til at fungere med lidt små-justeringer... men den brokkede sig over "g" i #ig, så jeg fjerne g'et (aner ikke hvad den gør?)
Jeg kigger lige lidt nærmere på det i morgen, men indtil da skal du foreløbig have mange tak :o)

Fejlmeddelelsen med "g" var: Warning: Unknown modifier 'g' in ....
Avatar billede olebole Juniormester
27. september 2007 - 23:41 #6
<ole>

$anchorNumber = 0;
$anchorLinks = array();

function processAnchor($matches) {
    global $anchorNumber, $anchorLinks;
   
    $ancherName = "h" . ++$anchorNumber;
    $anchorLinks[] = "<a href='#$ancherName'>" . $matches[2] . "</a>";

    return "<" . $matches[1] . " id='" . $ancherName . "'>" . $matches[2] . $matches[3];
}

$htmlCode = preg_replace_callback(
    "#<(h[1-3])>([^<>]*)(</h[1-3]>)#i",
    "processAnchor",
    $htmlCode
)

/mvh
</bole>
Avatar billede olebole Juniormester
27. september 2007 - 23:43 #7
- eller:
    "#(<h[1-3])>([^<>]*)(</h[1-3]>)#i",

- og:
    return $matches[1] . " id='" . $ancherName . "'>" . $matches[2] . $matches[3];
Avatar billede jl4511 Nybegynder
27. september 2007 - 23:47 #8
Arhhh... kunne ikke vente til i morgen :)
Det virker... men ville gerne lige høre ang. det "g"?
Mange tak - lægger du et svar?

Her kommer koden:
$htmlCode = "... noget tekst med div headere (h1, h2 osv.) ...";

$anchorNumber = 0;
$anchorLinks = array();

function processAnchor($matches) {
    global $anchorLinks, $anchorNumber;

  $anchorNumber++;
  $ancherName = "h$anchorNumber";

  $anchorLinks[] = "<a href='#$ancherName'>" . $matches[2] . "</a>";

  return "<a name='$ancherName'></a>" . $matches[1] . $matches[2] . $matches[3];
}

$htmlCode = preg_replace_callback(
    "#(<h[1-3]>)([^<>]*)(</h[1-3]>)#i",
    "processAnchor",
    $htmlCode
);

foreach($anchorLinks AS $anchor) {
    echo $anchor . "<br />";
}
echo $htmlCode . "<br />";
Avatar billede olebole Juniormester
27. september 2007 - 23:55 #9
- eller:
    "#<(h[1-3])>(.*?)</\\1>#i",

- og:
    return "<" . $matches[1] . " id='" . $ancherName . "'>" . $matches[2] . "</" . $matches[1] . ">";
Avatar billede olebole Juniormester
27. september 2007 - 23:58 #10
nielle's g-modifier var vist en 'fejl-import' fra JavaScript, hvor den bestemmer, søgningen skal være global. Én af de der tankefisk, vi hele tiden laver, når vi konstant skifter sprog  :)
Avatar billede jl4511 Nybegynder
28. september 2007 - 00:05 #11
Ok, tak olebole

Jeg er lidt i vildrede... nielle's løsning virker.
At der lige skulle laves en global på variablerne havde jeg styr på, som du.
Derudover var der vel egentlig ikke noget epokegørende nyt i dit bidrag, eller?
Men du skal have tak for opfølgning :o)
Avatar billede nielle Nybegynder
28. september 2007 - 06:47 #12
Yup, det lille g var bare en ups'er. :^)
Avatar billede jl4511 Nybegynder
28. september 2007 - 09:53 #13
Jep - og der var også en ")" istedet for en "}" ;-)
Jeg takker for din løsning - og du lægger et svar?
Avatar billede nielle Nybegynder
28. september 2007 - 10:58 #14
Sågerne :^)
Avatar billede nielle Nybegynder
28. september 2007 - 11:00 #15
Sådan går det tit når man bare sidder og koder i hovdet uden at efterprøve :^$
Avatar billede jl4511 Nybegynder
28. september 2007 - 11:16 #16
Hvilket jo ikke gør det mindre imponerende :o)
Denne funktion har virkelig sparet mig for en masse bøvl og hovedbrud.
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger chef for Lokal IT i hovedstadsområdet

Netcompany A/S

Test Consultant

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Teamleder til AL Sydbanks GDPR & Tech Regulation i Aabenraa