webForumDet fria alternativet

Hjälp med REGEXP-uttryck

Webbutveckling

34 svar · 1 471 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Hej!

Behöver lite hjälp med ett uttryck då jag själv inte är en mästare på detta!

Koden som jag vill ska detekteras är följande:

VÄNSTERKLAMMERCITAT=username]Text Text[/CITATHÖGERKLAMMER

Denna kod vill jag ska ersättas med:

<table style="margin-left: 10px;">
<tr>
<td>Username skrev:<br /><hr>Text Text<br /><hr></td>
</tr>
</table>

Några idéer? :)

Medlem sedan aug. 20002 975 inlägg
#2

Testa med

$pattern = "/\[citat=([^\]]+)](.*?)\[\/citat]/is";

$replace = "
  <table style=\"margin-left: 10px;\">
  <tr>
  <td>$1 skrev:<br /><hr>$2<br /><hr></td>
  </tr>
  </table>
";

$text = preg_replace($pattern, $replace, $text);
Medlem sedan maj 200010 687 inlägg
#3

Pattern:

\[citat\=([^\]]+)]([\s\S]+?)\[\/citat\]

Byt ut mot:

<table style="margin-left: 10px;">
<tr>
<td>$1 skrev:<br /><hr>$2<br /><hr></td>
</tr>
</table>
Medlem sedan maj 200010 687 inlägg
#4

Äsch, så här blir det när man får samtal mitt i inläggsskrivandet. Mattes kod är bra med jag skulle vilja byta ut (.*?) mot ([\s\S]+?).
Då klarar den även av radbrytningar i citatet. :)

Medlem sedan aug. 20002 975 inlägg
#5

Modifikatorn /s fixar så att den tar med radbrytningar också :)

Medlem sedan maj 200010 687 inlägg
#6

Ok!

Medlem sedan apr. 20041 597 inlägg
#7

Matte, som vanligt kom du med en strålande och fungerande lösning :) Erik, tack för dina tips också!

Citat-funktionen blev väldigt lik den som finns här på wF. Dock löser inte regexp-uttrycket ut att hantera en citering av ett redan citerat inlägg? Ett citat i citatet alltså! Hur kan man lösa detta med regexp? :OO

Medlem sedan aug. 20002 975 inlägg
#8

Då får du ersätta starttagg resp sluttagg var för sig.

Medlem sedan apr. 20041 597 inlägg
#9

Matte skrev:

Då får du ersätta starttagg resp sluttagg var för sig.

Öh va? :q Hur menar du?

Kan man inte använda preg_replace och få funktionen att applicera min replace-del på alla förekomster av den angivna pattern? Talar jag i tungor nu eller var det där begripligt det jag skrev? :e

Medlem sedan aug. 20002 975 inlägg
#10

Grejen är att man inte vet om det är en eller flera citat inom ett citat, eller om det är flera nivåer. Ej heller vet man om det kan finnas flera citat som inte ligger i varandra.
Det är m.a.o. väldigt svårt att hitta vilken som hör ihop med

.

Därför måste du då ta din citat och /citat var för sig, om du vill kunna ha citat inom citat.

Medlem sedan apr. 20041 597 inlägg
#11

Alltså köra funktion fler gånger efter varann?

Medlem sedan aug. 20002 975 inlägg
#12

Snarare något i stil med:

$pattern = array("/\[citat=([^\]]+)]/is", "/\[\/citat]/is");

$replace[] = "
  <table style=\"margin-left: 10px;\">
  <tr>
  <td>$1 skrev:<br /><hr>
";
$replace[] = "
  <br /><hr></td>
  </tr>
  </table>
";

$text = preg_replace($pattern, $replace, $text);

Men varför använda en <table> när du bara har en cell ?
Varför inte istället använda en <div> eller något ?

Medlem sedan nov. 2000857 inlägg
#13

Tråden flyttas från PHP..

Medlem sedan apr. 20041 597 inlägg
#14

Matte skrev:

Snarare något i stil med:

$pattern = array("/\[citat=([^\]]+)]/is", "/\[\/citat]/is");

$replace[] = "
  <table style=\"margin-left: 10px;\">
  <tr>
  <td>$1 skrev:<br /><hr>
";
$replace[] = "
  <br /><hr></td>
  </tr>
  </table>
";
$text = preg_replace($pattern, $replace, $text);

Fortsätter på denna tråd då jag inte haft tid att åtgärda problemet med citat i citaten förrän nu. Så den kod som är ovan, är den uppbyggd för att klara av just detta fenomen? Ser att $pattern innehåller en array men kan inte riktigt tolka vad som händer i själva uttrycket med de två replace-uttrycken som kommer lite längre ner. :)

Medlem sedan aug. 20002 975 inlägg
#15

Det första mönstret ($pattern) ersätts med det första $replace, det andra mönstret med den andra replace.

Medlem sedan apr. 20041 597 inlägg
#16

När jag implementerad ovanstående kod får jag följande felmeddelande:

[B]Fatal error:[/B] [] operator not supported for strings in
sökväg c:\xxx\fil.php on line 117

Vad kan vara fel?

Medlem sedan aug. 20002 975 inlägg
#17

När jag testar det fungerar det alldeles utmärkt.

Hur ser din kod ut ?

Medlem sedan apr. 20041 597 inlägg
#18

Koden ser ut så här:

$pattern = array("/\[citat=([^\]]+)]/is", "/\[\/citat]/is");
$replace[] = "<table style=\"margin-left:10px;\"><tr><td>$1 skrev:<br /><hr>";
$replace[] = "<br /><hr></td></tr></table>";

$reply['content'] = preg_replace($pattern, $replace, $reply['content']);
echo  nl2br($reply['content']); ?>
Medlem sedan aug. 20002 975 inlägg
#19

Fungerar hur bra som helst när jag testar.

Har du några konstigheter med arryen $reply ?
Vad får du om du kör print_r() på den, före din replace ?

Medlem sedan apr. 20041 597 inlägg
#20

Matte skrev:

Vad får du om du kör print_r() på den, före din replace ?

Följande information skrivs ut från ett testinlägg som jag gjorde med dubbla citat:

[CITAT=Fredrik][CITAT=Fredrik]Test[/CITAT] Test igen...[/CITAT] Ännu ett test...

Nu kan jag ju inte skriva ut det så att det blir rätt utan wF tolkar det precis så som jag vill att mitt ska bli tolkat :e

Jag vet inte vad jag gjorde eller inte gjorde men vips så fungerade allting galant. haha. Så märkligt det kan vara ibland :)

Bifogar en bild med resultatet. Tack för hjälpen än en gång! :e

P.S. Är det smidigare att använda en div istället för en table? Du skrev något om det tidigare.

citat.jpg
259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)