| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

25-08-2010, 16:42
|
|
yfolz
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 18
|
|
Verschachtelte HTML Tags filtern
Hallo Allerseits,
ich habe ein kleines Problem. Ich habe einen String mit HTML Code in dem sich verschachtelte span Tags mit Inhalt befinden. Ich würde gerne rekursiv den Inhalt auslesen weil ich den Inhalt später dynamisch on-the-fly in der Funktion weiterverarbeiten muss.
PHP-Code:
<?php $eingabe = '<span id="74506" class="black">Lorem ipsum dolor sit amet, <span id="74507" class="red">consectetuer</span> adipiscing elit</span>. <span id="74535" class="black">Aenean</span> <span id="74536" class="red">commodo</span> ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. <span id="74508" class="yellow">Maecenas <span id="74509" class="black">tempus</span>, tellus eget</span> condimentum rhoncus, sem quam semper libero, sit amet <br /><br />'; function parseTagsRecursive($eingabe) { $regex = '#<span id="[0-9]+" class="[a-zA-Z]+">[a-zA-Z0-9-_.<>\/,\:\"]*</span>#'; if (is_array($eingabe)) { $eingabe = '<b><div style="margin-left: 10px">'.$eingabe[1].'</div></b>'; }
return preg_replace_callback($regex, 'parseTagsRecursive', $eingabe); }
$ausgabe = parseTagsRecursive($eingabe);
echo $ausgabe; ?>
Leider ist der Inhalt in $eingabe[1] leider weg, und das äußere span wird nicht mit div ersetzt.
Bin für Hilfe dankbar.
Gruß Yvon
Geändert von yfolz (25-08-2010 um 16:47 Uhr)
|

25-08-2010, 16:45
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
Code umbrechen und zwar dalli.
Peter
PS: Auf "Ändern" klicken und dann schön brav mit der return-Taste arbeiten
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

25-08-2010, 16:47
|
|
yfolz
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 18
|
|
Hoffe so besser. Sorry!
|

25-08-2010, 17:33
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
1) da ist kein "äußeres" span ... sondern nebeneinander liegende spans ...
2) wieso sollte deine Zeichenkette eingabe sich plötzlich in ein array verwandeln, ohne das du etwas dafür tust ?
3) ..entsprechend kennt der kein $eingabe[1] ....
- das ist natürlich auch der Grund, warum NIE der div-"kram" dazukommt, weil er einfach bei der Abfrage is_array($eingabe) immer zu Erkenntnis "FALSE" kommt ($eingabe ist nunmal keins)
Code:
<span id="74506">
<span id="74507"></span>
</span>
<span id="74535"></span>
<span id="74536"></span>
<span id="74508">
<span id="74509"></span>
</span>
<br/>
<br/>
wenn ich mal den Fülltext weglasse, stehen diese Tags da .... vielleich stellst du mal nach diesem Muster dar, welche durch div ersetzt werden sollen
Sollte ich mich bei Punkt 2 geirrt haben, durch den rekursiven Aufruf ... schau mal in $eingabe[0] nach, was da "drin" steht ...
__________________
Wer LESEN kann, ist klar im Vorteil!
Geändert von eagle275 (25-08-2010 um 17:46 Uhr)
|

25-08-2010, 17:38
|
|
yfolz
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 18
|
|
Ich habe das hier als Ausgangsbeispiel genommen:
PHP-Code:
<?php $eingabe = "plain[indent] deep[indent] deeper [/indent]deep [/indent]plain";
function parseTagsRecursive($eingabe) { $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
if (is_array($eingabe)) { $eingabe = '<div style="margin-left: 10px">'.$eingabe[1].'</div>'; }
return preg_replace_callback($regex, 'parseTagsRecursive', $eingabe); }
$ausgabe = parseTagsRecursive($eingabe);
echo $ausgabe; ?>
Ich habe den Anschein das meine regex nicht korrekt ist. Und es sind span in span Tags.
Vielleicht habe ich mich auch falsch ausgedrückt. Ich benötige eine regex die mir jedes span mit der $eingabe ersetzt.
|

26-08-2010, 12:37
|
|
yfolz
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 18
|
|
Hallo, danke für die Info.
Die Daten die ich wollte habe ich jetzt. Und zwar habe ich das so gemacht.
PHP-Code:
<?php
$html = <<<HTML
<span id="74506" class="black">Lorem ipsum <span id='3493984'>blub</span>
sit amet, <span id="74507" class="red">consectetuer</span>
<span id="1234" class="blue">test</span> elit</span>.
<span id="74535" class="black">Aenean</span>
<span id="74536" class="red">commodo</span> ligula eget dolor. Aenean
massa. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu,
pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo,
fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis
pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi.
Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat
vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat
a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum.
Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper
ultricies nisi. Nam eget dui. Etiam rhoncus.
<span id="74508" class="yellow">Maecenas
<span id="74509" class="black">tempus</span>,
tellus eget</span> condimentum rhoncus, sem quam semper libero,
sit amet <br /><br />
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('/html/body/span[@id]/span[@id]|/html/body/span[@id]');
foreach ($tags as $tag) {
echo $tag->nodeValue . "<br/>";
}
?>
Jetzt stehe ich ein wenig auf dem Schlauch. Wie bekomme ich bei der Ausgabe auch noch die id aus $tag mit rein?
Gruß Yvon
|

26-08-2010, 12:59
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
ich glaub da musst du mittels
Code:
if ($tag->hasAttributes()==TRUE) {
$attrs = $tag->attributes;
foreach ($attrs as $attrName => $attrNode)
....
vorgehen
__________________
Wer LESEN kann, ist klar im Vorteil!
|

26-08-2010, 13:00
|
|
yfolz
Registrierter Benutzer
|
|
Registriert seit: May 2010
Beiträge: 18
|
|
Ich hab es gerade in den Moment in dem Du gepostet hast selbst hinbekommen:
PHP-Code:
$tag->getAttribute('id');
$tag->getAttribute('class');
Vielen Dank für Eure Hilfe!
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|