PHP Variable auseinander nehmen
princed
- php
Hallo,
Ich habe eine Variable in der sich ein längerer html code befindet aus diesen möchte ich einen bestimten teil auslesen und in einer weiteren variable speichern wie bekomm ich das hin?
Der text den ich haben möchte befindet sich beispielsweiße zwischen "<div class"test">" und " "
Tach!
Der text den ich haben möchte befindet sich beispielsweiße zwischen "<div class"test">" und " "
Finde die Positionen der beiden Texte. Zur ersten Position addierst du noch die Länge des ersten Teilstrings, woraufhin du die Position des gesuchten Wertes hast. Die Differenz zur Position des zweiten Wertes ist die Länge des auszuschneidenden Textes. Die dazu nätigen Funktionen befinden sich im Kapitel zu den Stringfunktionen. In vielen Sprachen, so auch PHP, enthalten ihren Namen pos, len und substr.
dedlfix.
Erstmal danke für den tipp auch wen ich nur die hälfte verstanden hab ein bischen geholfen hat es immerhin.
function get_between($input, $start, $end)
{
$substr = substr($input, strlen($start)+strpos($input, $start), (strlen($input) - strpos($input, $end))*(-1));
return $substr;
}
$page = file_get_contents("http://www.testseitevondericherlaubnisshab.de");
$a = "<div style="padding-top:9px">";
$b = " ";
echo get_between($page, $a, $b);
hab es jetzt so weit hinbekommen aber die schreibweise von der var a ist irgentwie falsch kann das bitte jemand kurz ausbessern mit erklärung am besten dankeschön schonmal in vorraus.
mfg princed
Hallo
$page = file_get_contents("http://www.testseitevondericherlaubnisshab.de");
$a = "<div style="padding-top:9px">";
$b = " ";
echo get_between($page, $a, $b);[/code]hab es jetzt so weit hinbekommen aber die schreibweise von der var a ist irgentwie falsch kann das bitte jemand kurz ausbessern mit erklärung am besten dankeschön schonmal in vorraus.
Frage: Wenn '"' der Stringbegrenzer ist, wann glaubst du, ist der String <div style="padding-top:9px"> zuende ist?
Antwort: Der String endet beim zweiten '"'.
Wenn du innerhalb eines mit '"' eingefassten Strings das '"' benutzen willst, musst du es maskieren ('"'). Alternativ kannst du ''' als Stringbegrenzer benutzen. Z.B. so '<div style="padding-top:9px">' oder "<div style='padding-top:9px'>" funktioniert es.
Tschö, Auge
Dankeschön Auge,
Nur leider bemerke ich jetzt das nächste problem und zwar ist die jetzige ausgabe einfach garnix... ich denke es liegt daran das, dass schon vor dem <div style...> vorkommt. Wie bekomm ich das jetzt geregelt irgentwelche tipps?
Von der Idee her Weis ich jetzt wie es geht allerdings hab ich leider zu wenig php erfahrung um das anständig zu schreiben :( deshalb nochmal die bitte könnte sich das jemand angucken und korrigieren bitte auch mit kleiner erklährung sonnst lern ich ja nix.
function get_between($input, $start, $end)
{
$substr = substr($input, strlen($start)+strpos($input, $start)*(-1));
$substr2 = substr($substr-strpos($substr, $end)*(-1));
return $substr2;
}
Meine Idee war erst Den anfang der variable "abzuschneiden" und dann mit $substr2 das ende abzuschneiden.
Hallo,
dank Fred bin ich gesten schon sehr weit gekommen,
nun hab ich allerdings ein wenig was geändert und es Funktioniert nix mehr...Ein fehler liegt wahrscheinlich in der var muster und zwar das / von </div> wen ich anstadt dessen <br> schreib funktioniert es aber trotzdem Meine einzige erklährung hierfür ist das der html text der importierten seite einfach zu lang ist kann das sein oder liegt der fehler doch wo anders?
[code lang=php]<?php
$str= file_get_contents("http://www.seite von der ich erlaubnisshab.html");
//Jetzt brauchst Du einen regulären Ausdruck für alsaein Suchmuster:
echo $str;
$muster='/<div class="test">(.*)</div>;/';
preg_match ( $muster, $str, $treffer );
//print_r($treffer); oder print $treffer[1]; oder noch besser:
if (preg_match ( $muster, $str, $treffer )) { # Nur wenn was gefunden wurde
array_shift($treffer); # Wegwerfen des ersten Array-Elements
foreach ($treffer as $ausgabe) {
print $ausgabe."<br />\n";
# $muster1='/href="(.*)">/';
# preg_match ( $muster1, $ausgabe, $treffer2 );
# print_r($treffer2);
}
Tach!
Ein fehler liegt wahrscheinlich in der var muster und zwar das / von </div> wen ich anstadt dessen <br> schreib funktioniert es aber trotzdem Meine einzige erklährung hierfür ist das der html text der importierten seite einfach zu lang ist kann das sein oder liegt der fehler doch wo anders?
Wenn du dich nicht mit den Grundlagen von regulären Ausdrücken beschäftigen willst, dann verwende sie einfach nicht. Ansonsten: Delimiter.
dedlfix.
Tach!
Ein fehler liegt wahrscheinlich in der var muster und zwar das / von </div> wen ich anstadt dessen <br> schreib funktioniert es aber trotzdem Meine einzige erklährung hierfür ist das der html text der importierten seite einfach zu lang ist kann das sein oder liegt der fehler doch wo anders?
Wenn du dich nicht mit den Grundlagen von regulären Ausdrücken beschäftigen willst, dann verwende sie einfach nicht. Ansonsten: Delimiter.
dedlfix.
Da ist wohl was beim kopieren des textes untergegangen eigentlich sollte da stehn "funktioniert es aber trotzdem nicht". Den fehler mit dem / hätte ich wohl auch irgentwie lösen können aber das bringt mir dan ja auch nix wen es dan trotzdem nicht geht.
Tach!
Da ist wohl was beim kopieren des textes untergegangen eigentlich sollte da stehn "funktioniert es aber trotzdem nicht". Den fehler mit dem / hätte ich wohl auch irgentwie lösen können aber das bringt mir dan ja auch nix wen es dan trotzdem nicht geht.
Du warst doch mit den guten alten Stringfunktionen schon fast am Ziel. Warum bleibst du dann nicht bei ihnen und begibst dich in die Komplexität der regulären Ausdrücke. Das nächste Problem, über das du vermutlich mit ihnen stolpern wirst, wird deren Gierigkeit sein.
Wenn der zweite eingrenzende String auch vor dem ersten vorkommen kann, dann kannst du auch in einem ersten Schritt zunächst den Teilstring ab dem ersten Begrenzungsstring ermitteln und in diesem dann die Position des zweiten Trennstrings ermitteln. Beachte Toms Einwurf mit der Zweideutigkeit des Ergebnisses von strpos(). Oder allgemein empfohlen: Immer bei unbekannten Funktionen die Handbuchseite aufmerksam studieren.
dedlfix.
Du warst doch mit den guten alten Stringfunktionen schon fast am Ziel. Warum bleibst du dann nicht bei ihnen und begibst dich in die Komplexität der regulären Ausdrücke. Das nächste Problem, über das du vermutlich mit ihnen stolpern wirst, wird deren Gierigkeit sein.
Der Code mit den regulären ausdrücken sah für mich einfach übersichtlicher aus und beinhaltete bereits die foreach schleife die ich ohnehin einbauen wollte. Und er hat eigentlich auch sofort funktioniert biss ich das gleich mit ner anderen unterseite probiert habe (var srt).
Was meinst du mit Gierigkeit?
Was meinst du mit Gierigkeit?
Du wolltest die Profifunktion benutzen :)
<http://de.selfhtml.org/perl/sprache/regexpr.htm#gierig_genuegsam@title=gierig vers. genügsam>
Beachte bei "Drumherum", dass dies Perl ist.
Dein aktuelles Problem löst diese Antwort.
Fred
Tach!
Du warst doch mit den guten alten Stringfunktionen schon fast am Ziel. Warum bleibst du dann nicht bei ihnen und begibst dich in die Komplexität der regulären Ausdrücke.
Der Code mit den regulären ausdrücken sah für mich einfach übersichtlicher aus und beinhaltete bereits die foreach schleife die ich ohnehin einbauen wollte. Und er hat eigentlich auch sofort funktioniert biss ich das gleich mit ner anderen unterseite probiert habe (var srt).
Du scheinst einerseits noch nicht genügend Gundlagen gelernt zu haben, wenn du schon an solchen einfachen Dingen wie Anführungszeichen in Strings scheiterst. (Lies dir dazu bitte mindestens den Abschnitt "Einleitung" und den nachfolgenden des Kontextwechsel-Artikels durch.)
Andererseits bereiten dir einfache logische Dinge anscheinend auch genügend Probleme: wenn der Suchstring vor der interessanten Stelle vorkommt, muss man eben erst danach zu suchen anfangen.
Und auf dieser Grundlage willst du mit dem hochkomplexen Thema der regulären Ausdrücke starten? Das ist nicht gerade etwas, zu dem ich dir guten Gewissens raten kann.
dedlfix.
Hier nochmal der orginal Text:
Ein fehler liegt wahrscheinlich in der var muster und zwar das / von </div> wen ich anstadt dessen <br> schreib funktioniert es aber trotzdem nicht(keine ausgabe).
Meine einzige erklährung hierfür ist das der html text der importierten seite einfach zu lang ist kann das sein oder liegt der fehler doch wo anders?
Hi,
Ein fehler liegt wahrscheinlich in der var muster und zwar das / von </div>
Ja, das ist ein Fehler, wenn du den / auch als Delimiter verwendest. Was dieses Stichwort bedeutet, dazu wurde dir bereits eine Seite verlinkt – also informiere dich bitte darüber.
MfG ChrisB
Hi,
Ein fehler liegt wahrscheinlich in der var muster und zwar das / von </div>
Ja, das ist ein Fehler, wenn du den / auch als Delimiter verwendest. Was dieses Stichwort bedeutet, dazu wurde dir bereits eine Seite verlinkt – also informiere dich bitte darüber.
MfG ChrisB
Bitte vergesst nun einmal das ich das mit </div> geschrieben hab...
Wenn mir dafür einer den richtigen Code gibt kann er ihn zwar gerne posten aber das ist nebensächlich viel wichtiger ist mir die frage warum es den auch nicht funktioniert wen ich anstadt "</div>" "<br>" schreib?(das <br> steht in html code direkt eine zeile über </div>)
Hi,
Bitte vergesst nun einmal das ich das mit </div> geschrieben hab...
Wenn mir dafür einer den richtigen Code gibt kann er ihn zwar gerne posten aber das ist nebensächlich viel wichtiger ist mir die frage warum es den auch nicht funktioniert wen ich anstadt "</div>" "<br>" schreib?(das <br> steht in html code direkt eine zeile über </div>)
„Funktioniert nicht“ ist keine sinnvolle Problembeschreibung.
</hilfe/charta.htm#tipps-fuer-fragende>
Bitte liefere ausreichend Informationen, um das Problem *nachvollziehbar* zu machen.
Was genau hast du versucht, mit welchen Eingabedaten, und mit welchem Ergebnis?
MfG ChrisB
if (preg_match ( $muster, $str, $treffer )) { # Nur wenn was gefunden wurde
array_shift($treffer); # Wegwerfen des ersten Array-Elements
foreach ($treffer as $ausgabe) {
print $ausgabe."<br />\n";
# $muster1='/href="(.*)">/';
# preg_match ( $muster1, $ausgabe, $treffer2 );
# print_r($treffer2);
}
}
else
{
echo "keine übereinstimmung";
}
~~~ wenn der code so aussieht steht im browser keine übereinstimmung obwohl es mehrere übereinstimmungen geben müsste.
Ich hab es auch Probiert das muster auf einzelne wörter anzusetzen bsw.:
$muster='/Nick(.\*)me;/'; (Nickname)
Wo auch keine übereinstimmung bei raus kommt.
Ich hab es auch Probiert das muster auf einzelne wörter anzusetzen bsw.:
$muster='/Nick(.*)me;/'; (Nickname)Wo auch keine übereinstimmung bei raus kommt.
Du hast noch immer ein Semikolon zu viel.
$muster='/Nick(.*)me;/'; # geht deshalb nicht
$muster='/Nick(.*)me/'; # geht
Fred.
Bitte vergesst nun einmal das ich das mit </div> geschrieben hab...
Wenn mir dafür einer den richtigen Code gibt kann er ihn zwar gerne posten aber das ist nebensächlich viel wichtiger ist mir die frage warum es den auch nicht funktioniert wen ich anstadt "</div>" "<br>" schreib?(das <br> steht in html code direkt eine zeile über </div>)
Tach Post!
Bitte zeige uns ggfs. die paar Zeilen des Codes, Dein Suchmuster und einen relevanten Textausschnitt. Verrate uns auch was gefunden werden soll.
Den Fehler kann man aber leicht finden:
In ?t=207846&m=1413154 hast Du folgendes präsentiert:
$muster='/<div class="test">(.*)</div>;/';
Da ist das Semikolon zuviel und der Slash vor dem "div>" nicht escaped. Du musst die den <http://de.selfhtml.org/perl/sprache/regexpr.htm@title=regulären Ausdruck> begrenzenden (und andere wie .?+*) <http://de.selfhtml.org/perl/sprache/regexpr.htm#maskierung@title=Zeichen maskieren> oder gegen andere, im Muster(!) unbenutzte Zeichen austauschen. Natürlich darf kein zeichen im Suchmuster zu viel sein, sonst gibt es keine Treffer. Genau das hat dann wohl das Semikolon nach "<br>" verursacht, welches vermutlich da stand.
$muster='/<div class="test">(.*)<\/div>/';
oder
$muster='@<div class="test">(.*)</div>@';
sollte also gehen.
Fred
Dankeschön hat mal wieder geklappt :D
Das simikolon hatte ich mir von deinen ersten code abgeguckt wo du es nach dem geschützten leerzeichen gemacht hattest. Nach einigen versuchen mit und ohne simikolum wo es aber anscheinend woanders dran gescheitert ist, hab ich das simikolom für richtig gehalten was mich wohl an der lösung des Problems gehindert hat...
Nur leider bekomm ich jetzt zwar ne ausgabe aber leider nur 1ne.
Hi,
Das simikolon
mit und ohne simikolum
das simikolom
Auweia.
MfG ChrisB
Ja ich hab manchmal so meine Probleme mit der Deutschen Sprache aber ist ja auch nicht meine Muttersprache.Und das Wort "Semikolon" hört sich für mich extrem komisch an.
Auweia.
Bitte nicht auf den Fragestellern rumhacken. Bleib höflich.
Fred
Nur leider bekomm ich jetzt zwar ne ausgabe aber leider nur 1ne.
Zeig uns bitte den Code mit Suchmuster, den Text und Dein Ergebnis. Hast Du mehrere Fundstellen, so verwende preg_match_all.
Dann hast Du das Problem mit der angesprochenen "Gierigkeit"
Beispiel:
<?php
$str='ABBBBABBBBABBBBA';
$muster='/A(.*?)A/';
if (preg_match_all ( $muster, $str, $treffer )) {
array_shift($treffer);
foreach ($treffer as $ar) {
foreach ($ar as $s) {
print $s."<br />\n";
}
}
}
?>
liefert:
~> php test9.php
BBBBABBBBABBBB<br />
<?php
$str='ABBBBABBBBABBBBA';
$muster='/A(.*?)A/';
if (preg_match_all ( $muster, $str, $treffer )) {
array_shift($treffer);
foreach ($treffer as $ar) {
foreach ($ar as $s) {
print $s."<br />\n";
}
}
}
?>
liefert:
~> php test9.php
BBBB<br />
BBBB<br />
Der Unterschied ist das Fragezeichen nach dem Stern, der für eine "beliebige Anzahl des Zeichens davor" steht. Der Punkt steht für "beliebiges Zeichen". Das Fragezeichen zwingt die Funktion beim ersten Fund zu stoppen, das Ergebnis für die Rückgabe im Array zu speichern und dann ab dieser Stelle weiter zu suchen. Deshalb findet diese alle Vorkommen des geklammerten Teiles.
Ohne das Fragezeichen sucht die Funktion bis zum letzten Vorkommen eines A und gibt alles dazwischen als das eine Ergebnis zurück.
Fred
Falls Dich irritiert hat, dass preg_match_all nur zweimal die 'B' gefunden hat, das lag daran, dass sowohl der linke als auch der rechte Begrenzer ein 'A' war und dieses beim Suchlauf sozusagen schon überschritten war.
Mit unterschiedlichen Begrenzern passt es:
<?php
$str='ABCABBCABBBC';
$muster='/A(.*?)C/';
if (preg_match_all ( $muster, $str, $treffer )) {
array_shift($treffer);
foreach ($treffer as $ar) {
foreach ($ar as $s) {
print $s."<br />\n";
}
}
}
?>
~> php test9.php
B<br />
BB<br />
BBB<br />
Fred
Ich kann dir einfach nicht genug danken dür die sehr ausführlichen und verständlichen Antworten!
Jetzt geh ich aber erstmal Schlafen und verschieb die Analyse deines Textes auf morgen.
mit preg_match_all hatte ich es allerdings schon probiert hab aber als ausgabe leider nur "array" bekommen. Ich dachte immer eine foreach schleife gibt die inhalte der einzelden arrays aus stimmt das so nicht?(Falls das aus den letzten beiträgen ersichtlich ist die frage einfach ignorieren)
Hi,
mit preg_match_all hatte ich es allerdings schon probiert hab aber als ausgabe leider nur "array" bekommen. Ich dachte immer eine foreach schleife gibt die inhalte der einzelden arrays aus stimmt das so nicht?
Doch. Aber ein Array kann mehr als eine „Dimension“ haben, und bei Benuztung von preg_match(_all) ist das auch meistens der Fall. Wie das Ergebnisarray aufgebaut ist, kann man in der Beschreibung zu preg_match im Handbuch nachlesen. Und auch, dass man sich den Aufbau unbekannter Datenstukturen ganz einfach mal mit print_r oder var_dump anschauen kann, gehört schon wieder in den Bereich Grundlagenwissen.
MfG ChrisB
Tach!
Nur leider bemerke ich jetzt das nächste problem und zwar ist die jetzige ausgabe einfach garnix... ich denke es liegt daran das, dass schon vor dem <div style...> vorkommt. Wie bekomm ich das jetzt geregelt irgentwelche tipps?
Beachte die Handbuchseite zu strpos(), da gibt es einen Offset-Parameter.
dedlfix.
Hello,
Erstmal danke für den tipp auch wen ich nur die hälfte verstanden hab ein bischen geholfen hat es immerhin.
Das ist schon ein netter Denkansatz, der viel Gelegenheit zur Diskussion gibt:
[code lang=php]function get_between($input, $start, $end)
{
$substr = substr($input, strlen($start)+strpos($input, $start), (strlen($input) - strpos($input, $end))*(-1));
return $substr;
}
Funktionen einfach so zu schachteln, ist in den meisten Programmiersprachen keine gute Idee - in PHP auch nicht. In PHP haben viele Funktionen einen varianten Rückgabewert (der Typ ist variabel) und können daher einen Fehlerwert zurückgeben. Bei strpos() wird 'false' zurückgegeben, wenn der gesuchte String nicht im durchsuchten enthalten ist.
Das solltest Du auf jeden Fall immer erst überprüfen, bevor Du weitermachst.
if( false === ($pos=strpos($input)))
{
return $xy;
}
wobei $xy hier einen von Dir festgelegten Fehlerwert repräsentiert, den die Gesamtfunktion dann zurückgibt, damit Du weißt, warum sie schiefgegangen ist.
Wenn PHP jetzt intelligent programmiert wäre, könnte eine Methode "$string->strpos($xy)" automatisch eine Exception mit dem Fehlerwert $xy auslösen, die dann aufgefangen werden könnte. Das würde die Programmierung mit angereihten oder geschachtelten Methoden erheblich vereinfachen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Moin!
Wenn PHP jetzt intelligent programmiert wäre, könnte eine Methode "$string->strpos($xy)" automatisch eine Exception mit dem Fehlerwert $xy auslösen, die dann aufgefangen werden könnte. Das würde die Programmierung mit angereihten oder geschachtelten Methoden erheblich vereinfachen.
Weil PHP intelligent programmiert ist, kannst du dir das selbst so hinbasteln, wenn du willst. Oder auch weglassen, wenn's nicht interessant ist.
Oder du wechselst zu Java, damit kann man gerüchteweise auch spielen, aber es soll nicht soviel Spaß machen.
- Sven Rautenberg
Hello,
Weil PHP intelligent programmiert ist, kannst du dir das selbst so hinbasteln, wenn du willst. Oder auch weglassen, wenn's nicht interessant ist.
Wie würdest Du das machen?
Den Errorhandler vergewaltigen?
Was ich nicht will, ist alle Funktionen als Methoden neu zu erfinden...
Oder du wechselst zu Java, damit kann man gerüchteweise auch spielen, aber es soll nicht soviel Spaß machen.
Das ist mir zu langsam.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Oder du wechselst zu Java, damit kann man gerüchteweise auch spielen, aber es soll nicht soviel Spaß machen.
Das ist mir zu langsam.
[ ] Ich weiß wovon ich spreche und werfe auf keinen Fall die Startzeit der VM mit der Ausführungszeit des compilierten Codes durcheinander.
Bitte ankreuzen.
[latex]Mae govannen![/latex]
Oder du wechselst zu Java, damit kann man gerüchteweise auch spielen, aber es soll nicht soviel Spaß machen.
Das ist mir zu langsam.[ ] Ich weiß wovon ich spreche und werfe auf keinen Fall die Startzeit der VM mit der Ausführungszeit des compilierten Codes durcheinander.
Bitte ankreuzen.
Aus Nutzersicht ist das allerdings reine Haarspalterei. Es gibt einen Zeitpunkt t1, an dem der Nutzer das Programm startet und einen Zeitpunkt t2, ab dem die Funktionalität zur Verfügung steht und der Nutzer loslegen kann.
Ob die reine Ausführungszeit des Codes hierbei 0.01% oder 80% der Differenz t2 - t1 ausmacht, ist für ihn vollkommen unerheblich, wenn diese Differenz oberhalb seiner Erwartung liegt. Für ihn ist es dann langsam.
Stur lächeln und winken, Männer!
Kai
Aus Nutzersicht ist das allerdings reine Haarspalterei. Es gibt einen Zeitpunkt t1, an dem der Nutzer das Programm startet und einen Zeitpunkt t2, ab dem die Funktionalität zur Verfügung steht und der Nutzer loslegen kann.
Wenn man hierbei übersieht, dass man Java insbesondere im Webkontext sinnvoll so betreiben möchte, dass der Start desApplication Servers(t1) nur einmal erfolgt und dann nur noch auf t2 wartet, ja.
Ob die reine Ausführungszeit des Codes hierbei 0.01% oder 80% der Differenz t2 - t1 ausmacht, ist für ihn vollkommen unerheblich, wenn diese Differenz oberhalb seiner Erwartung liegt. Für ihn ist es dann langsam.
Würde man unsinnigerweise bei jedem Request den Application Server neu starten, wäre die Argumentation schlüssig.
Hello,
Würde man unsinnigerweise bei jedem Request den Application Server neu starten, wäre die Argumentation schlüssig.
In meiner Zeit in Dortmund haben wir da unterschiedliche Lösungen gegeneinander laufen lassen. Das war immer unser Spaß im College, bis wir dann abends selber zu langsam wurden...
Java hat immer verloren, owohl wir da die ausgefuchstesten Programmierer hatten.
C-Sharp war wirklich scharf. Das war wirklich nur beim ersten Mal langsam und alle Folgeaufrufe waren angenehm schnell. Aber der erforderliche Ovberhead und die TKO waren einfach Overkill.
PHP ohne besondere Engines hat gut mithalten können, war preiswert, leicht zu adminsitrieren und Dank der unterschiedlichsten Frameworks auch leicht in der Applikationserstellung (wenn man das passende benutzt hat).
Es ging, wohlbemerkt, immer um Server-Applikationen, nicht dass jemand aus Versehen Java auf dem Client sucht...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Finde die Positionen der beiden Texte. Zur ersten Position addierst du noch die Länge des ersten Teilstrings, woraufhin du die Position des gesuchten Wertes hast. Die Differenz zur Position des zweiten Wertes ist die Länge des auszuschneidenden Textes. Die dazu nätigen Funktionen befinden sich im Kapitel zu den Stringfunktionen. In vielen Sprachen, so auch PHP, enthalten ihren Namen pos, len und substr.
Sehr schön! Deine Code-Prosa finde ich immer super;-)
off:PP
Tach Post!
Finde die Positionen der beiden Texte. Zur ersten Position addierst du noch die Länge des ersten Teilstrings, woraufhin du die Position des gesuchten Wertes hast. Die Differenz zur Position des zweiten Wertes ist die Länge des auszuschneidenden Textes. Die dazu nätigen Funktionen befinden sich im Kapitel zu den Stringfunktionen. In vielen Sprachen, so auch PHP, enthalten ihren Namen pos, len und substr.
Klingt nach einer guten Idee, ist aber keine. Geht besser so.
Sorry, Fred.
Hallo,
Ich habe eine Variable in der sich ein längerer html code befindet aus diesen möchte ich einen bestimten teil auslesen und in einer weiteren variable speichern wie bekomm ich das hin?
Es gibt da viele Methoden. Wie wäre es mit einem regulären Ausdruck oder dem Umwandeln in ein Array mit explode?
Das mit dem Hilfsarray erklär ich Dir als Erstes:
$str='Der "Standdardtext für der Ausgaben in erste Programmen lautet:<div class="test">Hallo Welt! Wie geht es Dir?</div>';
Du willst das am ersten '<div class="test">' cracken:
$T1='<div class="test">';
Und dann am ' '
$T2=' ';
Der Befehl heißt explode.
$ar=explode($T1, $str, 2);
Im ersten Element $ar[0] steht alles bis $T1, also bis '<div class="test">', also 'Der "Standdardtext für der Ausgaben in erste Programmen lautet:'. Das brauchst Du nicht.
Aber den zweiten Teil, in $ar[1] steht jetzt: 'Hallo Welt! Wie geht es Dir?</div>';
Das cracken wir also noch mal:
$ar=explode($T2, $ar[1], 2);
Jetzt steht in $ar[0] 'Hallo Welt!' und in $ar[1] steht: 'Wie geht es Dir?</div>';
Die zweite Lösung mit einem regulärem Ausdruck ist natürlich "die ultimative Profilösung" und enorm leistungsfähig, hier wäre die Funktion preg_match Kandidat der Wahl. Die verursacht aber einen hohen Lernaufwand. Ich zeige es:
Das kennst Du schon:
$str='Der "Standdardtext für der Ausgaben in erste Programmen lautet:<div class="test">Hallo Welt! Wie geht es Dir?</div>';
Jetzt brauchst Du einen regulären Ausdruck für ein Suchmuster:
$muster='/<div class="test">(.*) /';
Feuer Frei!
preg_match ( $muster, $str, $treffer );
print_r($treffer); oder print $treffer[1];
~~~ oder noch besser:
~~~php
if (preg_match ( $muster, $str, $treffer )) { # Nur wenn was gefunden wurde
[link:http://php.net/manual/de/function.array-shift.php@title=array_shift]($treffer); # Wegwerfen des ersten Array-Elements
[link:http://php.net/manual/de/control-structures.foreach.php@title=foreach] ($treffer as $ausgabe) {
print $ausgabe."<br />\n"; Ausgabe aller Treffer
}
}
Wenn Du Lösung 2 noch nicht "schnallst", dann mach Dir erst mal keine Sorgen. Das kommt noch und so wie deine Frage gestellt ist brauchst Du es noch nicht unbedingt.
Fred
Du bist mein Held des tages :D
Klappt alles wunderbar Danke!