[php] lastige reg exp

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Ik wil <a>-tags plaatsen om $sWord in de string $sHTML, echter alleen als:

1) $sWord geen tag is of een attribute van een tag, zie het woord 'type' in

HTML:
1
2
3
4
5
<!-- mag niet -->
<input type="checkbox" value="1">

<!-- mag wel -->
<p>Type 1</p>


2) $sWord staat niet tussen een <a> en een </a> (is dus zelf geen link)

HTML:
1
2
<!-- mag niet -->
<a href="home.htm">Type</a>


Nu heb ik in PHP de volgende regular expression gefabriceerd:

PHP:
1
2
3
4
5
6
/*
toelichting: de (s?) is voor de meervoudsvorm van engelse woorden
*/
$reNeedle = "/(?!<.*?)\b(".$sWord.")(s?)\b(?![^<>]*?>)/si" 

$sHTML  = preg_replace($reNeedle, '<a>$1$2</a>', $sHTML);


Probleem: deze needle houdt alleen rekening met de eerste voorwaarde, niet met de tweede. Ik heb geen idee hoe ik de tweede voorwaarde in kan bouwen (twee negative lookaheads?)

Iemand een idee?

[ Voor 0% gewijzigd door Rekcor op 03-10-2007 16:03 . Reden: tiepvaud ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Dit moet je niet met een regexp doen. De makkelijkste manier is eigenlijk om de html gewoon in een dom tree te zetten en dan enkel de text nodes aan te pakken. Een andere mogelijkheid zou een stackbased parser kunnen zijn, maar dan ben je wel een beetje afhankelijk van valide html.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Janoz schreef op woensdag 03 oktober 2007 @ 16:32:
Dit moet je niet met een regexp doen. De makkelijkste manier is eigenlijk om de html gewoon in een dom tree te zetten en dan enkel de text nodes aan te pakken. Een andere mogelijkheid zou een stackbased parser kunnen zijn, maar dan ben je wel een beetje afhankelijk van valide html.
Voor PHP's DOM parser lust toch ook alleen XHTML? Oh nee, zie ik hier: DOMDocument->loadHTML().

Toch vind ik dat wat omslachtig overkomen (als het niet anders kan zal ik wel moeten natuurlijk). Kan het echt niet met een reg exp? Ik vond het al zo stoer dat die eerste reg exp me gelukt was _/-\o_.

[ Voor 4% gewijzigd door Rekcor op 03-10-2007 16:47 ]


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Mmm... toch gaat die DOM-methode niet lukken. Op de server draait namelijk PHP4, en die kent geen DOMDocument->loadHTML(). Aangezien ik niet kan garanderen dat mijn pagina's XHTML zijn, moet ik toch met reguliere expressies aan de gang... |:(

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Nogmaals. Dit moet je niet met reguliere expressies doen. Als de dom manier niet werkt zou ik gewoon voor een simpele parser gaan. Aangezien het hier enkel om het ontsluiten van een woord gaat moet dat heel simpel kunnen. Je begint gewoon vooraan in je tekst en leest dit woord voor woord door. Houd bij of je op die plek binnen een tag zit of bin een stuk omsloten door anchors. Zolang je daar niet tussen zit vervang je het woord, en anders niet.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Zoals Janoz al zegt is een reg. exp. hier niet echt ideaal. Je kan voor dit soort gevallen beter een stackautomaat gebruiken.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Wellicht heb je iets aan frickY in "[PHP] zoek n-th word probleem (maar dan ..." ?

[ Voor 59% gewijzigd door frickY op 04-10-2007 11:17 ]


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Ok bedankt. Ik ga deze parser maar eens proberen.
Pagina: 1