Avatar billede Slettet bruger
07. april 2005 - 22:06 Der er 14 kommentarer og
1 løsning

preg_split til opdeling af tekst

Hej

Jeg har en tekst:
--- Start ---
bla bla bla bla

<no nl2br>
<table>
  <tr>
  <td>Test</td>
  </tr>
</table>
</no nl2br>

bla bla bla bla
--- slut---

Den vil jeg gerne have til at se sådan ud efter at have været kørt gennem møllen:
--- Start ---
bla bla bla bla<br>
<br>
<table>
  <tr>
  <td>Test</td>
  </tr>
</table>
<br>
bla bla bla bla<br>
--- slut---

Jeg har læst mig frem til at preg_split må være optimal til et løse mit problem, men det er da vist for atomfysikere at få det til at virke ;o)

Regner med at preg_split kan dele min tekst op i 3 arrays, så jeg kan køre nl2br på det første array og det sidste.

Har brug for noget hjælp...
Avatar billede barklund Nybegynder
07. april 2005 - 22:25 #1
Jeg ville gøre det ved at klippe de(n) del(e) ud, der ikke skal laves nl2br på, huske dennes/disses position(er), kører nl2br på resten og indsætte de(n) udklippede del(e).

Det kan laves ret enkelt.
Avatar billede Slettet bruger
07. april 2005 - 22:28 #2
Ja det lyder jo meget simpelt... Kan du forklare nærmere?
Avatar billede detox Nybegynder
07. april 2005 - 22:39 #3
En preg_split kan vel laves sådan:

$arr = preg_split("/<\/?no nl2br>/s", $str);

og så kan du samle det igen sådan:

$str = nl2br($arr[0]).$arr[1].nl2br($arr[2]);
Avatar billede barklund Nybegynder
07. april 2005 - 22:46 #4
For eksempel som:

$str = "bla bla
bla bla

<no nl2br>
<table>
  <tr>
  <td>Test</td>
  </tr>
</table>
</no nl2br>

bla bla
bla bla";

preg_match_all("#(<no nl2br>.*?</no nl2br>)#si", $str, $matches);
foreach ($matches[1] as $i => $m) {
    $str = str_replace($m, "[[".$i."]]", $str);
}
$str = nl2br($str);
$str = preg_replace("/\[\[(\d+)\]\]/e", "\$matches[1][\\1]", $str);

--
Morten Barklund
Avatar billede Slettet bruger
07. april 2005 - 22:49 #5
Utrolig så langt det hjalp mig, i forhold til at jeg selv har brugt et par timer, uden at komme nogle vegne :o)

2 problemer:
- <no nl2br>-linjen indeholder også et linjeskift, hvordan får jeg det med?
- Hvad gør jeg sådan rent praktisk, hvis den tekst jeg henter fra min db indeholder x-antal <no nl2br>??
Avatar billede barklund Nybegynder
07. april 2005 - 22:51 #6
Mit script skulle gerne fange dem alle sammen. Hvad mener du med linjeskiftet i <no nl2br> - det der kommer efter skal blive til <br /> eller skal ikke?
Avatar billede Slettet bruger
07. april 2005 - 22:52 #7
barklund...> Det ser fint ud, bortset fra den efterlader mine tags i koden. Skal de fjernes med ereg_replace?
Avatar billede Slettet bruger
07. april 2005 - 22:53 #8
barklund...>
Den linje der indeholder <no nl2br> indeholder også et linjeskift. Vil gerne have at hele linjen (incl. linjeskiftet) forsvinder.
Avatar billede barklund Nybegynder
07. april 2005 - 22:54 #9
Yesh yesh, så må det være:

preg_match_all("#(<no nl2br>\n(.*?)</no nl2br>\n)#si", $str, $matches);
foreach ($matches[1] as $i => $m) {
    $str = str_replace($m, "[[".$i."]]", $str);
}
$str = nl2br($str);
$str = preg_replace("/\[\[(\d+)\]\]/e", "\$matches[2][\\1]", $str);

Prøv den :)

--
Morten Barklund
Avatar billede Slettet bruger
07. april 2005 - 22:57 #10
<no nl2br> linjerne er der stadigvæk, og nu har den lavet linjeskift i det stykke den ikke skulle røre *G*
Avatar billede barklund Nybegynder
07. april 2005 - 23:03 #11
Ah, dine linjeskift er jo nok både \r og \n - såsom:

preg_match_all("#(<no nl2br>\r\n(.*?)</no nl2br>\r\n)#si", $str, $matches);
foreach ($matches[1] as $i => $m) {
    $str = str_replace($m, "[[".$i."]]", $str);
}
$str = nl2br($str);
$str = preg_replace("/\[\[(\d+)\]\]/e", "\$matches[2][\\1]", $str);

:)

--
Morten Barklund
Avatar billede Slettet bruger
07. april 2005 - 23:09 #12
Kanont, det virker som det skal.

Læg et svar og pointene er dine :o)

Jeg smider 40 point mere oveni, hvis du gider forklare lidt om hvad det er rutinen gør, sådan rent praktisk?

Jeg er på vej i seng, men kigger herinde i morgen tidlig igen.
Avatar billede barklund Nybegynder
07. april 2005 - 23:14 #13
Hvad den gør? Jo, den bruger preg_match_all til at fange alle del-udtryk i strengen der matcher mønstret:

<no nl2br>{linjeskift}{alle mulige tegn}<no nl2br>{linjeskift}

Alle disse gemmes i et array som:

$matches[1][0] = "<no nl2br>\r\nher er noget tekst</no nl2br>\r\n";
$matches[2][0] = "her er noget tekst";

Altså i $matches[1] gemmes hele strengen som matches og i $matches[2] gemmes kun teksten imellem udtrykkene.

Så erstattes alle strenge $matches[1] med "[[$i]]", hvor $i er nummeret i $matches[1]. Dette nummer bruges så til at bagefter erstatte alle "[[$i]]" med de tilhørende strenge i $matches[2] - som altså er det samme som de udklippede med undtagelse af de fjernede tags og linjeskifts.
Avatar billede Slettet bruger
08. april 2005 - 07:33 #14
Egentlig ret simpelt, hvis det ikke lige var for syntaksen med alle /\[] *g* :o)
Avatar billede barklund Nybegynder
08. april 2005 - 09:07 #15
Tark for points :)
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