# RegEx HTML Tags+INHALT entfernen



## ReggaePanda (16. Juli 2010)

Hi, ich muss in einem String alle HTML-Tags entfernen ABER inklusive dessen Inhalt(also den text der zwischn den tags steht)

Beispiel:

STRING:
-----------------------
<a href="blabla.html" target="_blank">Linktext</a><br><br />
<input name="derName" />
DER TEXT SOLL AUSGEGEBEN WERDEN UND MEHR NICHT <b>mich übrigends nicht!</b>
<ul>
<li>nein mich auch nicht</li>
</ul>
----------------------

AUSGABE:
----------------------
DER TEXT SOLL AUSGEGEBEN WERDEN UND MEHR NICHT
----------------------


Kann mir irgendjemand dabei behlflich sein?


----------



## Yaslaw (16. Juli 2010)

```
<input name="derName" \/>([^<]*)
```


----------



## ReggaePanda (16. Juli 2010)

Vielen Dank schonmal, aber leider wollt ich das so nicht haben....

Der Quellcode ist nur ein Beispiel und kann immer anders sein, deswegen darf da nichts hart codiert sein.
Leider ist auch die ausgabe falsch. Mir wird alles ausgegeben, außer dem input und dem was ich haben will 

Siehe:
http://www.regex-tester.de/uc_1072_de.html


----------



## timestamp (16. Juli 2010)

Das hier entfern alles zwischen < und >

```
$pattern = "/<.*>/";
$str = preg_replace($pattern, "", $str);
```


----------



## Back2toxic (16. Juli 2010)

Probier's mal damit:

```
<([a-zA-Z])*(.*)(</\1>|/>)*
```
Musst das Ergebnis anschließend wohl noch'

Edit: Oh man - ich glaub langsam ich denk zu kompliziert..


----------



## Yaslaw (16. Juli 2010)

ReggaePanda hat gesagt.:


> Vielen Dank schonmal, aber leider wollt ich das so nicht haben....
> 
> Der Quellcode ist nur ein Beispiel und kann immer anders sein, deswegen darf da nichts hart codiert sein.
> Leider ist auch die ausgabe falsch. Mir wird alles ausgegeben, außer dem input und dem was ich haben will
> ...



Schön und gut. Nur sehe ich bei deinem Beispiel keine Regellässigkeit die bestimmt, was herausgenommen werden soll.
Du hast Texte die du willst und solche die du nicht willst. Beschreibe mal die Regeln eindeutig mit Worten.


----------



## ReggaePanda (16. Juli 2010)

Also erstmal von vorne

ich arbeite mit Simple_html_dom

und da hab ich ein
DIV
in welchem weitere Elemente mit html Tags sind,
aber auch Text ohne html Tags.

Den String den ich habe, ist der String zwischen dem Div Tag. (siehe "Beispiel" oben)

Jetzt möchte ich den String innerhalb des DIV, haben, welcher nicht von irgendeinem Tag umschlossen ist. (siehe "Ausgabe" oben).

Leider können die HTML Tags immer unterschiedlich sein.
Wenn innerhalb des Divs nur elemente sind die von html Tags umschlossen sind darf auch NICHTS ausgespuckt werden.

-----

Die anderen Wege gehen (nach escapen und versuchten anpassungen) leider auch nicht 

http://www.regex-tester.de/uc_1073_de.html


----------



## deepthroat (16. Juli 2010)

Hi.


```
//
  // Text, der durchsucht werden soll
  //
  $subject = '<a href=\"blabla.html\" target=\"_blank\">Linktext</a><br><br />
<input name=\"derName\" />
DER TEXT SOLL AUSGEGEBEN WERDEN UND MEHR NICHT <b>mich übrigends nicht!</b>
<ul>
<li>nein mich auch nicht</li>
</ul>';
  //
  // Der Reguläre Ausdruck
  //
  $pattern = '@<(\S+)([^>]*/>|.*</\1\s*>)@is';
  //
  // Ersatzstring
  //
  $replace = '';
  //
  // RegExp auswerten, Ersetzung durchführen
  //
  $result = preg_replace($pattern, $replace, $subject);
```
Gruß


----------



## Yaslaw (16. Juli 2010)

Hab mal ein Beispiel mit einzelnem entfernen

```
<?php 
$html = 
'html-text
<div>
<a href="blabla.html" target="_blank">Linktext</a><br><br />
<input name="derName" />
DER TEXT SOLL AUSGEGEBEN WERDEN UND MEHR NICHT <b>mich übrigends nicht!</b>
<ul>
<li>nein mich auch nicht</li>
</ul>
</div>
mehr text
<div>noch mehr Text den wir haben wollen</div>';

//Alle Div-Inhalte ermitteln
$pattern = '/<div>(.*)<\/div>/sU';
// RegEx mit preg_match_all() auswerten 
preg_match_all($pattern, $html, $array); 

//pro div-Inhalt einzeln ausdünnen
foreach($array[1] as $string){

    // Alle <tag>text</tag> entfernen
    $pattern = '/<[^>]*>[^<]*<\/[^>]*>/s';
    $ersatz = '';
    do{
        $string = preg_replace($pattern, $ersatz, $string,-1, $count);
    } while ($count > 0); 
    
    //Alle <tag /> und <tag/> entfernen
    $pattern = '/<[^\/]*\/>/s';
    do{
        $string = preg_replace($pattern, $ersatz, $string,-1, $count);
    } while ($count > 0); 
    
    echo $string;

}
?>
```


----------



## timestamp (16. Juli 2010)

Was ist denn an meiner Version von oben falsch?

http://www.regex-tester.de/uc_1074_de.html


----------



## EvilO (16. Juli 2010)

Moin zusammen,

Wie wäre es ganz einfach mit strip_tags()? Die Funktion könnte das Problem ohne fehleranfällige reguläre Ausdrücke sofort lösen.

In den Comments stehen noch diverse Ansätze, wie man bestimmte Inhalte behalten kann.


----------



## timestamp (16. Juli 2010)

Reguläre Ausdrücke sind eigentlich nicht fehleranfällig. Dafür aber strip_tags:


			
				php.net hat gesagt.:
			
		

> Warnung
> 
> Da strip_tags() HTML nicht wirklich validiert, kann es passieren, dass bei unvollständigen oder unkorrekten Tags mehr Text/Daten gelöscht werden als erwartet.
> Warnung
> ...


----------



## ReggaePanda (16. Juli 2010)

@timestamp

oh, hatte den Modifier s an, deswegen hats nicht funktioniert :|
die löscht sogar blöde <br> tags  nr1 für mich ... das einfachste ist wohl oft das beste 

@deepthroat

die Funktioniert auch klasse nur das die nicht richtig escaped war und ich hab noch ein kleines fragezeichen eingefügt.
@<(\S+)([^>]*\/>|.*?<\/\1\s*>)@is

@yaslaw
auch klasse aber ich habs lieber kompackt 


Also nochmal an alle danke!


----------



## EvilO (17. Juli 2010)

@timestamp

Zuverlässige HTML-Filterung geht weder mit regulären Ausdrücken noch mit strip_tags(), da HTML dafür (ob man es glaubt oder nicht) zu komplex ist-. Einzige Möglichkeit wirklich sicher HTML zu filtern sind Libraries wie z.B. HTML-Purifier. Falls man aber aus einem String das komplette HTML-Markup rausfiltern will, kann man strip_tags() nehmen, man darf nur keine Whitelist im zweiten Parameter angeben, dann ist es dautlich sicherer als ein Regex, die nie alle Möglichkeiten berücksichtigen kann, wie man HTML durchschleusen kann.


----------

