webForumDet fria alternativet

Vilken serie tecken som helst

Webbutveckling

13 svar · 718 visningar · startad av M@rtin

Medlem sedan dec. 19992 085 inlägg
Frågan#1

Hur matchar man vilken serie tecken som helst? "." matchar ju inte \n vilket ställer till stora problem.

Det jag vill göra är att ersätta [ b ]vilken serie tecken som helst även med \n nya rader[/ b ] med <b>vilken serie....</b>

Någon som vet?

Medlem sedan juni 20014 421 inlägg
#2

[\s\S]*

Medlem sedan dec. 19992 085 inlägg
#3

Tusen tack för det snabba svaret, funkar klocka.

Medlem sedan dec. 19992 085 inlägg
#4

Det uppstod dock ett annat problem, när jag gjorde på detta sätt.

[ b ] lite fet text [/ b ] lite text som inte är fet [ b ] mer fet text [/ b ]
ersätts nu med:
<b> lite fet text [/ b ] lite text som inte är fet [ b ] mer fet text </b>

Vilket blir jättetokigt. Verkar som att den går igenom från både vänster och höger istället för att börja vid första taggen och sedan sluta när den når nästa.

Är det möjligt att lösa detta problem?

Medlem sedan aug. 20039 340 inlägg
#5

Tva saker ska du gora.

  1. Satta pa greedy matchning. Detta varierar beroende pa vilken variant det handlar om
  2. Sedan bor du anvanda detta uttryck for att matcha valfritt tecken: [^[]* alt detta [^\[]* (Hakparentesen ar escapad, kan behovas.)
    Detta uttryck tillater inte nastlade taggar, men jag tror att det ar en bra borjan for dig.
Medlem sedan juni 20014 421 inlägg
#6

För en matchning av nästlade taggar i php: http://forums.devnetwork.net/viewtopic.php?t=45346

Medlem sedan maj 200010 687 inlägg
#7

Det är ju inte nestlade taggar han vill åt. räcker med att han skriver [\s\S]*? så är han i hamn.

nitro2k01: Menar du inte stänga av greedy matchning? greedy matching uppfattar jag som att den matchar på så mycket som möjligt...

Medlem sedan aug. 20039 340 inlägg
#8
"[-b]Fett fett![-/b] Fett ofett![-b]Fett fett![-/b]".replace(/\[b\]([^[]*)\[\/b\]/i, "<b>$1</b>")
--> <b>Fett fett!</b> Fett ofett![-b]Fett fett![-/b]
"[-b]Fett fett![-/b] Fett ofett![-b]Fett fett![-/b]".replace(/\[b\]([^[]*)\[\/b\]/ig, "<b>$1</b>")
--> <b>Fett fett!</b> Fett ofett!<b>Fett fett!</b>

Jamfor resultaten ovan. Greedy ar ratt i detta fall!

Medlem sedan feb. 2000438 inlägg
#9

/g är inte greedy, /g är ersätt alla. * är greedy, *? är o-greedy. * eller *? spelar ingen roll med [^[] eftersom den då kommer att fastna på första möjliga [ i båda fallen. Byter man ut [^[] till [\s\S] så krävs o-greedy för att det ska funka. Alltså är [^[] bättre, eftersom det inte är alla tecken som ska matchas, utan alla utom [.

Medlem sedan maj 200010 687 inlägg
#10

Tror g står för global. ? används som Csson skrev för att det inte ska vara greedy.

Sen så är [^[] inte så bra eftersom att man inte kommer få nån match på t.ex. [ b ]...[...[ /b ]

Medlem sedan dec. 19992 085 inlägg
#11

Oj oj, många svar av delade meningar. Jag försökte sätta greedy genom att skriva g efter # men då försvann allt så jag tog bort det och körde med [^[]* bara och det verkar fungera:

      $content = preg_replace('#\[ b ]([^[]*)\[/ b ]#i','<b>\1</b>',$content);
      $content = preg_replace('#\[ i ]([^[]*)\[/ i ]#i','<i>\1</i>',$content);

Detta verkar fungera för alla fall jag lyckats komma på:
[ b ]fett[/ b ]
[ b ]fett[/ b ] ofett [ b ] fett
[ b ]fett[/ b ] ofett men [ i ] kursivt [/ i ] [/ b ]
[ b ]fett[/ b ] med öppna h[akar [/ b]

Nåt jag missat?

Annars tack för all hjälp ! :)

Medlem sedan dec. 19992 085 inlägg
#12

Nu var jag nog lite för snabb med att svara igen, hittade ett problem, om man skriver koden i den ordning som jag skrev ovanför så funkar t.ex.
[ i ][ b ]fett & italic[/ b ][/ i ]
men inte
[ b ][ i ]fett & italic[/ i ][/ b ]
då blir den kursiv men [ b ] taggen skrivs ut

Medlem sedan maj 200010 687 inlägg
#13

Om du läser inläggen ovanför så ser du lösningen.

Medlem sedan dec. 19992 085 inlägg
#14

Hehe ja okej, ursäkta.

För tydlighetens skull:

      $content = preg_replace('#\[ b ]([\s\S]*?)\[/ b ]#i','<b>\1</b>',$content);
      $content = preg_replace('#\[ i ]([\s\S]*?)\[/ i ]#i','<i>\1</i>',$content);
255 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)