Avatar billede cwboy Nybegynder
05. juli 2006 - 13:53 Der er 11 kommentarer og
1 løsning

Fjern <br> men behold <br><br>

Jeg har brug for en reg.exp. (til brug i .NET) der kan fjerne <br> men beholde <br><br> (og beholde dem som dobbelte)

Den skal tage højde for "dialekter". Ex. <br>, <BR>, <br/>, <br /> osv.

Er ikke ligefrem en haj udi reg.exp. - de driller altid :(
Avatar billede cwboy Nybegynder
05. juli 2006 - 13:57 #1
Rettelse... enkelt-<br> skal erstattes med mellemrum - og dobbel-<br> skal ikke erstattes.
Avatar billede gizmo-gizmo Nybegynder
05. juli 2006 - 15:43 #2
Hvad med noget så simpelt som:

(<(br|BR) ?\/?>){2}
Avatar billede cwboy Nybegynder
05. juli 2006 - 16:05 #3
Jeg har fx følgende (test)-tekst:

Her er en artikel<br><br>Og i artiklen er der indbygget<br>linjeskift, som jeg vil have fjernet,<br>så det er browseren der bestemmer<br>hvornår der skal laves linjeskift.<br><br>Med undtagelse af når der står 2 linjeskift<br><br>som er inddeling af afsnit.

Det skulle gerne blive til

Her er en artikel<br><br>Og i artiklen er der indbygget linjeskift, som jeg vil have fjernet, så det er browseren der bestemmer hvornår der skal laves linjeskift.<br><br>Med undtagelse af når der står 2 linjeskift<br><br>som er inddeling af afsnit.

Ovenstående kan jeg vel kun bruge til at matche 2 <br>'er efter hinanden - og det er jo ikke det, jeg er ude efter... faktisk er jeg ude efter at matche <br> som IKKE må være efterfulgt af et nyt <br>.

Dvs. den skal matche de "<br>"'er der står alene, og ikke de dobbelte - som skal bibeholdes som dobbelte.
Avatar billede gizmo-gizmo Nybegynder
05. juli 2006 - 16:30 #4
Ups, det var mig der var en idiot og ikke kunne læse spørgsmålet.

Jeg har ikke lige erfaringer med at bruge regexp i C#, men hvis du kan bruge "lookahead" kunne du f.eks.:
(<br ?\/?>)(?!<br ?\/?>)

Den matcher et <br> tag hvor der foran IKKE også er et <br> tag
Avatar billede gizmo-gizmo Nybegynder
05. juli 2006 - 16:31 #5
gahh.......
Avatar billede gizmo-gizmo Nybegynder
05. juli 2006 - 16:35 #6
glem mit svar ;)
Avatar billede Slettet bruger
05. juli 2006 - 17:10 #7
Jeg vil tillade mig at foreslå noget helt andet. Da dobbelt <br> skal bruges til at angive nyt afsnit, hvad så med at skifte det ud med den kode, som netop betyder at her kommer et nyt afsnit? Så er der ingen dobbelte <br> til at drille, når du bagefter fjerner de enkelte <br>.

Koden for nyt afsnit er </p><p>

Hvis det skal være gyldigt xhtml, så skal du sørge for at have en <p> i starten også.
Avatar billede nielle Nybegynder
05. juli 2006 - 17:58 #8
Prøv at kigge på denne her:

using System;
using System.Text.RegularExpressions;

namespace r719161
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = @"Her er en artikel<br><br/>Og i artiklen er der indbygget<br />linjeskift, som jeg vil have fjernet,<br>så det er browseren der bestemmer<br>hvornår der skal laves linjeskift.<br><br>Med undtagelse af når der står 2 linjeskift<br><br>som er inddeling af afsnit.";
            Console.WriteLine(text);

            Regex re = new Regex(@"(?<!<br(?:\s*/)?>)<br(?:\s*/)?>(?!<br(?:\s*/)?>)", RegexOptions.IgnoreCase);
                       
            Console.WriteLine();

            text = re.Replace(text, " ");
            Console.WriteLine(text);
        }
    }
}
Avatar billede cwboy Nybegynder
05. juli 2006 - 19:37 #9
nielle - smider du et svar. Det var præcis, hvad jeg var ude efter :)

sandbox - godt forslag, som jeg også selv overvejede. Det er artikler, der kommer "udefra", så vi har ikke altid 100% styr på, hvordan de bliver formatteret. Nogen i rå tekst og nogen i HTML - for at have nogenlunde styr over outputtet i alle formater vil vi ikke blande for mange tags ind i det. Selvom det HTML-mæssigt måske ville være den bedste løsning.
Avatar billede nielle Nybegynder
05. juli 2006 - 19:39 #10
Svar :^)
Avatar billede gizmo-gizmo Nybegynder
05. juli 2006 - 20:33 #11
Nielle: Jeg har lige et spørgsmål. Det var lidt det samme jeg havde forsøgt mig med (altså en negativ lookbehind og lookahead), men da jeg prøvede det i PHP gav det mig fejlen "lookbehind assertion is not fixed length", så jeg troede ikke det var muligt. Hvordan kan det være at det virker i C# og ikke PHP?
Avatar billede nielle Nybegynder
05. juli 2006 - 21:05 #12
> Hvordan kan det være at det virker i C# og ikke PHP?

Der er mere regelen end undtagelsen at regex-implementationen variere fra programmerinsgssprog til programmerinsgssprog. Og netop lookbehind er i øvrigt et af de steder hvor der er meget forskel (f.eks. understøttes det slet ikke i VB Script/ASP).

Jeg er ikke ekspert i detaljerne omkring PHP's preg_xxxx() implentation, men det lader altså til at *-qualifieren ikke er tilladt i en lookbehind.

Uden dog at have afprøvet den, vil jeg gætte på at denne virker i PHP:

(?<!(?:<br>|<br/>|<br />))

Den dækker selvfølgelig ikke så bredt som versionen med \s*, men mon ikke at den alligevel rammer de relevante tilfælde?
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