webForumDet fria alternativet

Regexp för modereringsfunktion

Webbutveckling

8 svar · 576 visningar · startad av lillebror

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

Hej!

Jag håller på att skapa ett textmeddelande som visas när en tråd i forumet blivit modererad.

Min tanke är att jag använder ett par taggar för att markera vilken del av inlägget som skall osynliggöras för besökarna.

Så här har jag tänkt mig att det ska vara:

[MODERERAD=Uid(ett heltal, vem som modererat inlägget)=Paragraf#(Vilken paragraf som tillämpats vid bedömning)]Text text text[/MODERERAD]

Den text som finns mellan taggarna skall ersättas med ett meddelande liknande det som finns på wF

Redigerat med anledning av webForums regler §1.
Synpunkter angående detta beslut, ta kontakt med USERNAME alternativt forumledarna.

USERNAME
Moderator, webForum

Hur skall ett regexp-uttryck för php se ut för att i MODERERAD-taggen tillåta ett userID i form av ett heltal samt ytterligare ett heltal efter nästa = för att markera rätt paragraf?

Medlem sedan dec. 20025 483 inlägg
#2

Om jag förstått det rätt:

preg_replace('/\[modererad=(\d+)=(\d+)\]([^\d]+)((?:.|\r|\n)*?)USERNAME((?:.|\r|\n)*?)USERNAME(.*?)\[\/modererad\]/i', '<p>$3$2.$4$1$5$1$6</p>', $str);

För enkelhetens skull kanske du vill skriva moderatorns användarnamn direkt (vid Uid) istället för dennes medlemsnummer. (Om du gör den föreslagna ändringen måste du byta den första (\d+) mot ([^=]+), vilket implicerar att ett användarnamn ej får innehålla likhetstecknet.)

I ovanstående uttryck har jag antagit att texten mellan taggarna är utformad som den i citatrutan i ditt inlägg, d.v.s. att "$1" skall ersättas med $ + paragrafnumret, och att USERNAME skall ersättas med medlemsnumret.

Medlem sedan apr. 20041 597 inlägg
#3

Peter S skrev:

Om jag förstått det rätt:

preg_replace('/\[modererad=(\d+)=(\d+)\]([^\d]+)((?:.|\r|\n)*?)USERNAME((?:.|\r|\n)*?)USERNAME(.*?)\[\/modererad\]/i', '<p>$3$2.$4$1$5$1$6</p>', $str);

För enkelhetens skull kanske du vill skriva moderatorns användarnamn direkt (vid Uid) istället för dennes medlemsnummer. (Om du gör den föreslagna ändringen måste du byta den första (\d+) mot ([^=]+), vilket implicerar att ett användarnamn ej får innehålla likhetstecknet.)

I ovanstående uttryck har jag antagit att texten mellan taggarna är utformad som den i citatrutan i ditt inlägg, d.v.s. att "$1" skall ersättas med $ + paragrafnumret, och att USERNAME skall ersättas med medlemsnumret.

Tack för hjälpen! :)

Har en fundering angående uttrycket. USERNAME som du har skrivit på två ställen, är det tänkt att jag ska ta bort det?! Mellan de båda taggarna kan det finnas vilken inläggstext som helst. När klamrarna finns runt om så skall den texten göras osynligt samtidigt som ett standardmeddelande visas.

Medlem sedan dec. 20025 483 inlägg
#4

Aha, då blir det så här

preg_replace('/\[modererad=([^=]+)=(\d+)\](?:.|\r|\n)*?\[\/modererad\]/i', '<p>Redigerat med anledning av dittForums regler $$2.<br>Synpunkter angående detta beslut, ta kontakt med $1 alternativt forumledarna.<br><br>$1<br>Moderator, dittForum</p>', $str);

Jag är litet osäker på fragmentet $$2 ovan: det är möjligt att du får escape:a det första dollartecknet. Testa!

Medlem sedan apr. 20041 597 inlägg
#5

Tack Peter! Det fungerar strålande! :)

En liten sak till. När ett inlägg nu har blivit modererad så vill jag göra så att det inte går att redigera. När jag kör ditt rexexp-uttryck, får jag ut true om det stöter på MODERERAD-klamrarna och vice versa, false om det inte hittar några? Tänkte lagra detta värde för att göra redigeringskontrollen.

Medlem sedan dec. 20025 483 inlägg
#6

Kanon! (y)

preg_replace() returnerar den ursprungliga strängen om ingen ersättning gjorts. Så du kan alltså gör någonting sådant här

$inlagg = "...";
if (preg_replace(..., ..., $inlagg) != $inlagg){
  //ersättning gjord
} else {
  //ingen ersättning gjord
}
Medlem sedan apr. 20041 597 inlägg
#7

Det var något sådant jag tänkte. Nu kom jag på att när jag har modererat ett inlägg och satt klamrar runt det avsnitt som ska bort så är databasdesignen sådan att det sparas ett moderatedbymemberID i databasen för den posten så när jag sedan visar en tråd plockar jag med det fältet i resultatet och kan på så vis göra en jämförelse för att avgöra om EDIT-funktionen skall vara tillgänglig för den användaren :)

Kommer de där taggarna att fungera om det är tomt mellan dem? Det kan ju vara så att man behöver redigera ett inlägg på lite olika ställen.

Medlem sedan dec. 20025 483 inlägg
#8

Ja, uttrycket tar även hänsyn till de fall då det är tomt mellan taggarna.

Medlem sedan apr. 20041 597 inlägg
#9

Great!

258 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)