Osäker på regular expression

Tråden skapades och har fått 7 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Bollnäs
  • 2008-10-14 08:35

Jag sitter med en funktion där jag vill byta ut alla <hn> och <p>-taggar i en sträng till att bevara formateringen men länka innehållet till en Wordpress-artikel (därav get_permalink).

Nu är jag inte superhaj på regexp, så jag tar tacksamt emot tips på felaktigheter.

Koden fungerar (hittills), men jag är rädd att jag förbisett något.

$text = preg_replace('{(<[a-z1-6]{1,2}[^>]*>)(.*?)(</[a-z1-6]{1,2}>)}','\1<a href="'.get_permalink($post->ID).'">\2</a>\3',$text);
  • Medlem
  • Mölndal
  • 2008-10-14 08:49

Du vet ju själv hur din källsträng ser ut, men [a-z1-6]{1,2} tillåter t ex även taggar som <1>.
Det efterföljande (.*?) känns lite tveksamt. Även om du gjort stjärnan lat, finns möjligheten att den äter upp en kommande felformaterad tagg. Säkra upp den lite grand, t ex med [^<>]*.

  • Medlem
  • Bollnäs
  • 2008-10-14 09:14

De taggar jag vill tillåta i källan är <h1>-<h6> och <p>.

Är det en bättre idé med [p|h1-6] ?

Nu ser det ut så här:

$text = preg_replace('{(<[p|h1-6]{1,2}[^>]*>)(.[^<>]*?)(</[p|h1-6]{1,2}>)}','\1<a href="'.get_permalink($post->ID).'">\2</a>\3',$text);
  • Medlem
  • Mölndal
  • 2008-10-14 12:34

Allt inom [ ] blir en character class, så man kan inte riktigt skriva som du gjort ovan. p|h[1-6] funkar däremot. Notera att {1,2} då inte heller ska vara med.

Sen har du en löstryckt punkt i mitten, vad är den tänkt att göra?

  • Medlem
  • Bollnäs
  • 2008-10-14 15:24

Ok. Punkten var kvarglömd.

Men jag får ingen match på p|h[1-6] alls.

Om jag har [p|h][1-6] får jag match på <h1>-<h6> men inte på <p>. Men med [p|h1-6]{1,2} får jag match på båda.

Tänker jag fel?

  • Medlem
  • Mölndal
  • 2008-10-14 15:42

OK, du måste sätta p|h[1-6] inom parenteser eftersom | har så låg prioritet. Och då måste du också uppdatera numrena på dina backreferenser i replace-uttrycket. Din variant fungerar (uppenbarligen) också, men då riskerar du att fånga även taggar som <ph>, <1p>, <p|> m fl.

Finns det möjlighet att använda namngivna capture groups? Jag tycker det brukar underlätta avsevärt, och man slipper överraskningar när man vill lägga till en parentes nånstans för prioritet.

  • Medlem
  • Bollnäs
  • 2008-10-14 16:42

Nu fungerar det när jag lade till parenteser.

Det finns absolut möjlighet att lägga till namngivna capture groups. Jag har inte tagit mig så långt i regexp-världen ännu bara.

Så här ser det ut nu:

$text = preg_replace('{(<(p|h[1-6])[^>]*>)([^<>]*?)(</(p|h[1-6])>)}','\1<a href="'.get_permalink($post->ID).'">\3</a>\4',$text);

Tack så mycket för att du tar dig tid att svara.

  • Medlem
  • Mölndal
  • 2008-10-14 20:09

Ingen orsak. Det är så sällan nån är intresserad, så jag får passa på för att hålla kunskaperna igång.

1
Bevaka tråden