2016-06-21 4 views
0

Ist es mit nur regexp (und oder php) möglich, nur ein bestimmtes Muster, das außerhalb eines bestimmten Musters und innerhalb eines bestimmten anderen Muster, in PHP (oder möglicherweise mit? R in PHP Regexp für rekursive Aspekt davon) ?Wie kann ich {Tags} nur innerhalb von sichtbarem HTML und nicht innerhalb des Attributbereichs von Elementen abgleichen?

Die Idee wäre Ich möchte die Tags innerhalb von> {ThisSpace} < und nicht innerhalb < {ThisSpace}> in einer einzigen Zeile sichtbaren HTML-Textes übereinstimmen.

Ein Beispiel für die Textzeile ist die folgende Halb html und Tag-Mix Combo

<div {IgnoreThis} id="{AndIgnoreThisOne}">I want to be able to only get {TheBracketTagsWithin} the visible html areas, excluding title and textarea and any html tag similar to those tags </div {AlsoIgnoreThese}> 

ich versucht habe, meine eigene regexp dafür zu machen, aber versagt .. ich eine Combo von PHP verwenden kann & regexp, aber etwas fehlt, oder nicht verstehen, etwas hier ..

hier ist, was ich versuche zu regexp

(?<!\<\!--|\{|\<){([a-zA-Z0-9]*?)}(?!--\>|\}|\>) 

Dies funktioniert t ignorieren er {{IgnoreThese}} am Ende des Divs, weil das nächste Zeichen> ist, aber ich kann diesen Regexp anscheinend nicht so modifizieren, dass er vorwärts schaut, bis er gefunden hat.

Ich komme zu der Erkenntnis, dass dies eine andere Sache sein kann, die einen DOM Parser benötigt, und ich weiß ... "Sie können eine HTML DOM Pars mit RegExp machen, Newb!" ... Ich verstehe das Frage ist, wie kann ich eine Übereinstimmung oder Zeichenposition oder irgendetwas für nur die {Tags}, die in sichtbarem HTML sind? Und ohne dass ein DOM Parse mir sagt, dass es Fehler gibt oder keine Antwort gibt, weil es HTML-Code gibt?

Jede Hilfe wird geschätzt, auch wenn sie mich nur in die richtige Richtung weist.

Danke!

-EDIT-

Etwas, das ich vergessen zu erwähnen, ist, da dies eine einzige Zeile HTML ist es nicht immer das Ende des HTML-Tag sein kann (es ist auf eine künftige Linie sein kann), Umgekehrt ist möglicherweise auch nicht immer ein Start-Tag und nur ein End-Tag. Für Zeilen, die kein Start- oder End-Tag haben, habe ich bereits eine Lösung, die dafür verantwortlich ist, "innerhalb von HTML-Raum" oder "innerhalb von Attributräumen" zu sein. Daher kann ohne Zeilen- oder End-Tags angenommen werden das hat ein {BracketTag} sollte auch erfasst werden.

Ich mag die Antwort fühle, ist direkt an der Spitze meines Fingers, aber es ist nur eine Reichweite in der richtigen Richtung zu lösen ..

Antwort

0

Warum für jede Instanz von> ... suchen nicht regex verwenden < Verwenden Sie dann Ihren aktuellen Code, um jedes Spiel nach Tags zu durchsuchen?

EDIT: so etwas wie dieses Versuchen: (?<=>)(?:.*?)(?<={)(.*?(?=}))(?:.*?)(?:.*?)(?=})(?:.*?)(?=<)

Blick hinter für>, dann nicht einfangende Gruppe von allem bis zu {, erfassen alles bis zu} <, nicht capture alles vorhat. Ich denke, Sie möchten einen globalen Modifikator geben, um alle möglichen Ergebnisse zu erhalten.Sie werden es php konvertieren müssen

+0

das fühlt sich eher wie ein Kommentar als Antwort – Gordon

+0

Apologies, werde ich sehen, ob ich es bewegen kann – Elenchus

+0

Oh, anscheinend kann ich nicht kommentieren, ohne 50 rep – Elenchus

0
$str = '<div {IgnoreThis} id="{AndIgnoreThisOne}">I want to be able to only get {TheBracketTagsWithin} the visible html areas, excluding title and textarea and any html {tag} similar to those {tags} </div {AlsoIgnoreThese}>'; 
$str = preg_replace("/<.*?>/", "", $str); 
preg_match_all("/{.*?}/", $str, $matches); 
foreach ($matches[0] as $match) echo $match . "\n"; 
Verwandte Themen