Ungültiger HTML-Code mit Regex ausbereinigen

580
Peter Hofman

Ich brauche einen pcre Regex, der alle html img-Tags ohne src-Teil auswählt. Lange Geschichte. Mit Hilfe bin ich dazu gekommen, (?-s)<img(?!.*?src).*?\/>was gut funktioniert hat, bis eine Zeile einen zweiten img-Tag WITH src-Part bekam. Der Regex entsprach dem ersten <imgmit dem letzten />:(

Wie kann ich wählen Sie das schlechte Teil <img border="0" />von:

<p align="center"><img border="0" /> <a href="http://www.megaevent2014.com/enllac/"><img alt src="http://www.megaevent2014.com/banner/gran/" /></a></p> 

In einem regulären Ausdruck.

Und die img-Tags können aus vielen Gründen ungültig sein. Das Ausmisten von "Grenzen" hilft nicht. Ich muss die Tags ohne Src auswählen, mich um nichts anderes kümmern.

Bitte Rat, Mit freundlichen Grüßen, Peter

0
Siehe diese Antwort auf stackoverflow !! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 Lord Peter vor 9 Jahren 0
@LordPeter Richtig, es kann nicht ausfallsicher ausgeführt werden. In bestimmten begrenzten Kontexten kann es jedoch funktionieren. LatinSuD vor 9 Jahren 0

1 Antwort auf die Frage

0
dashard

Das folgende Regex-Muster funktioniert für mich und sollte für PCRE Regex gut geformt sein:

<img(\s*(?!src)([\w\-])+=([\"\'])[^\"\']+\3)*\s*\/?> 
  • Um es aufzuschlüsseln, fangen Sie mit dem Literal <imgan und entsprechen dann einem \s*beliebigen Leerzeichen [\r\n\t\f ]null oder unbegrenzt.
  • Das (?!src)ist die negative Vorschau, die dafür sorgt, dass die Zeichenfolge srcwird nicht abgestimmt.
  • Die zweite Capture-Gruppe ([\w\-])+sucht [a-zA-Z0-9_]zwischen einem und beliebig vielen Zeitpunkten und ist gierig (finden Sie sie so oft wie möglich). Das \-ist ein wörtliches Suchen nach einem Bindestrich, falls er sich innerhalb des <img>Tag-Paares befindet.
  • Das =ist eine wörtliche Suche nach einem Gleichheitszeichen.
  • Die dritte Capture-Gruppe ([\"\'])[^\"\']+\3versucht, entweder ein einfaches oder doppeltes Anführungszeichen zu finden, dann etwas anderes, ABER ein einfaches oder doppeltes Anführungszeichen (ein- oder mehrmals) und dann die \3Übereinstimmungen, die als dritte Capture-Gruppe gefunden wurden (entweder ein einfaches oder doppeltes Anführungszeichen) .)
  • Schließlich entspricht das Null- oder unbegrenzte \s*Leerzeichen jedem Leerzeichen [\r\n\t\f ], das \/?gleiche >trifft einmal genau auf einen Schrägstrich zu und das ist die schließende Klammer der gesamten Angelegenheit.

Regex macht Spaß. :-)