text zwischen zwei markern auslesen ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausdruck
auslese
bar code
beispiel
code
dom
http
manual
markierung
match
methode
nachzulesen
performance
schwer sagen
string
tag
text
treffer
url
variante methode
-
Hallo
ich möchte aus einem tag/string">String den Text zwischen zwei Markierungen auslesen
wenn String <noscript> enthält, dann alle zwischen <noscript> und </noscript> in die Variable übergeben
leider klappt es so nicht: (hab ich mir aus dem php.net Manual zusammen-gewurschtelt)
if ( preg_match('@^(?<noscript>)?([^</noscript>]+)@i', $myCode, $treffer)) { $myCode = $treffer[1]; }
jetzt hab ich auch gelesen, das ginge evtl. auch direkt mit preg_replace
aber wie?
edit: auch damit klappts leider (noch) nicht ???
$myCode = "blablabla<noscript>das hier will ich haben</noscript>blablabla"; $pattern = '/^<noscript>(?P<htmlcode>\d+)</noscript>$/'; preg_match($pattern, $myCode, $matches); if ( !empty($matches['htmlcode']) ) { $myCode = $matches['htmlcode']; }
was ist falsch?
Beitrag zuletzt geändert: 16.4.2011 13:47:05 von ikatalog -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Viele Wege führen nach Rom. Hier sind drei:
<?php $myCode = 'blablabla<noscript>das hier will ich haben</noscript>blablabla'; // 1. Methode $pattern = '/<noscript>(.*?)<\/noscript>/'; preg_match($pattern, $myCode, $matches); echo $matches[1]; //-- echo '<br />'; //-- // 2. Methode $tags = array(); $dom = new DOMDocument; @$dom->loadHTML($myCode); $tags = $dom->getElementsByTagName('noscript'); foreach ($tags as $tag){ echo $tag->nodeValue; } //-- echo '<br />'; //-- // 3. Methode $text = explode('<noscript>', $myCode); $text = explode('</noscript>', $text[1]); echo $text[0]; ?>
Beitrag zuletzt geändert: 16.4.2011 14:17:10 von fabo -
vielen Dank !!!
(dumme) Frage: wie bitte soll man darauf kommen, dass bei methode1 mit <\/noscript> ein Backslash rein kommt ?!?
naja, ist halt wohl einfach so :-)
methode 2 ist auch interessant, methode3 wohl eher eine Not-Lösung
welche der 3 methoden braucht wohl am wenigsten performance? ... ich schätze mal die methode1, oder? -
Naja...
$pattern = "|<noscript>(.*?)</noscript>|";
würde auch funktionieren ;)
Zu deiner Frage... Das lässt sich schwer sagen (dafür aber herausfinden). Ich tendiere zu Methode 3, wobei die anderen beiden Methoden einfach schicker sind.
explode ist aber definitiv nichts für große Strings.
Beitrag zuletzt geändert: 16.4.2011 14:38:07 von fabo -
Hallo,
wie fabo schon sagte, wenn nur eine noscript-Sektion vorkommt, dann ist die 3. Methode am schnellsten.
Ansonsten ist die RegExp-Variante (Methode 1) am besten, weil dabei weniger Speicher verbraucht wird und eine gescriptete Lösung mit einer for-Schleife bei den Scriptsprachen PHP und Perl nicht an die Performance der modernen RegExp-Maschienen rankommt.
Allerdings ist ein RegExp auch mit Vorsicht zu genießen, wenn er zu umfangreich wird, dann sinkt die Performance drastisch, weshalb man dann eine einfache Vorabselektierung vornehmen sollte, dies ist hier aber nicht der Fall.
Um zu sehen wie extrem der Unterschied zwischen den RegExp-Methoden und einer Scriptlösung ist, kannst du dir ja mal einen kleinen Vergleich ansehen, den ich mal aus Spaß zu einem Forenbeitrag hier gemacht habe:
http://www.lima-city.de/thread/8-1-2011-regex-problem/page%3A0/perpage%3A30#962599
Außerdem muss bei der ersten Lösung ein Backslash rein, um den darauffolgenden Slash zu maskieren, das ist nötig, da der Reguläre Ausdruck in diesem Beispiel mit einem Slash "begrenzt" sprich begonnen und beendet wird.
Beispiel:Wir wollen das vorkommen foo/bar finden, dazu vergleichen wir einige Reguläre Ausdrücke: /foo/bar/ => der Ausdruck der gesucht wird ist "foo", außerdem wird ein Fehler geworfen, weil die Modifier "b" "a" und "r" nicht bekannt sind /foo\/bar/ => der Ausdruck der gesucht wird ist "foo/bar" @foo/bar@ => der Ausdruck der gesucht wird ist "foo/bar" @foo\/bar@ => der Ausdruck der gesucht wird ist "foo/bar"
Alle Links die du brauchst um das ganze nachzulesen sind hier:
http://de.php.net/manual/de/reference.pcre.pattern.modifiers.php
http://de.php.net/manual/de/regexp.reference.escape.php
http://de.php.net/manual/de/regexp.reference.delimiters.php
Und zusätzliches zur Performance
http://de.php.net/manual/de/regexp.reference.performance.php
Mit freundlichen Grüßen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage