Grüß euch!
ich habe ein Skript geschrieben, welches den HTML-Code von einer Website ausliest und in ein Array speichert. Dafür verwende ich momentan _INetGetSource () [Blockierte Grafik: http://traveleworld.com/images/tick.png], _StringBetween () [Blockierte Grafik: http://www.dsl-surfer24.de/custom_pages/gfx/icons/tick_off.gif], StringSplit (), StringLeft (), StringTrimLeft (), StringRight () und StringTrimRight () sowie _ArraySort ().
Ich möchte das Skript jetzt auf meinen Webspace schieben und muss es dafür in PHP umformen.
Ich habe es bereits geschafft, _INetGetSource () [Blockierte Grafik: http://traveleworld.com/images/tick.png] , zu umschreiben, Finde aber keine Funktion, die _StringBetween () [Blockierte Grafik: http://www.dsl-surfer24.de/custom_pages/gfx/icons/tick_off.gif] , ersetzt (keine Funktion schreibt die Ergebnisse in ein Array).
Ich hoffe, hier kann mir jemand helfen.
lg tobias
PS: Ist etwas Offtopic; hoffentlich störts nicht allzu sehr
AutoIt zu PHP
-
- [ gelöst ]
-
tobi_girst -
19. Februar 2012 um 13:22 -
Geschlossen -
Erledigt
-
-
Du brauchst also eine Funktion, die das selbe tut wie _StringBetween()?
Falls ja... Hier mal ein Ansatz:
PHPfunction _StringBetween($s_String, $s_Start, $s_End, $v_Case = ''){ $r = explode($s_Start, $s_String); if (isset($r[1])){ $r = explode($s_End, $r[1]); return array($r[0]); } return ''; }
Zu beachten ist hierbei jedoch, dass $v_Case nur Deko ist und in der Funktion keinerlei Nutzen hat.
Du musst jetzt nurnoch die Funktion in deinem Script unterbringen. Eine Ersetzung einzelner Zeilen ist damit nicht mehr von Nöten.
EDIT:
_StringBetween gibt ein 0 basiertes Array zurück. Hab die Funktion dahingehend mal verändert. Ansonsten könnte man auch mit einer Regexpression arbeiten. Da würde dann auch v_Case wieder eine Rolle spielen
-
- Offizieller Beitrag
Gerade _StringBetween sollte doch easy sein. Kannst du doch, wenn ich mich recht erinnere fast 1:1 übernehmen. Hier findest du die php-RegExp Funktionen. Syntaktisch nicht anders als in AutoIt.
-
Leider kenne ich mich mit regulären Ausdrücken nicht aus. Ich habe die UDF ausgegraben und den _StringBetween-Code so umgebaut:
PHP
Alles anzeigenfunction _StringBetween($s_String, $s_Start, $s_End) { $s_case = "(?i)"; $s_pattern_escape = "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)"; $s_Start = preg_replace ($s_Start, $s_pattern_escape, "\\$1"); $s_End = preg_replace ($s_End, $s_pattern_escape, "\\$1"); $a_ret = preg_match_all($s_String, "(?s)" & $s_case & $s_Start & "(.*?)" & $s_End, 3); Fehlerzeile!1 Return $a_ret; }
bei der Zeile 8 kommt folgende Fehlermeldung: Fatal error: Only variables can be passed by reference in D:\xampp\htdocs\readres.php on line 31
ich habe aber keine Ahnung, ob ich überhaupt die richtigen Funktionen verwende :wacko: :wacko:
SoftCreatR's Schnipsel habe ich auch nicht zurechtbekommen.
Mein Programmierer-Herzgehört eben AutoIt; PHP brauche ich fast nie und kann deshalb auch nur die Basics.
Bitte um Hilfe;
tobias -
PHP
preg_match_all("/" . $s_Start . "(.*?)" . $s_End. "/s", $s_String, $a_preg, PREG_SET_ORDER); foreach ($a_preg as $a_tmp) { array_push($a_ret, $a_tmp[1]); } Return $a_ret;
Als Ergebnis findest du in $a_ret[] alle Strings zwischen $s_Start und $s_End. Kannst du dir dann mal testweise von print_r() ausgeben lassen.Das funktioniert aber erst, wenn du die beiden preg_replace() auskommentierst.
Da machst du leider etwas falsch.Ich möchte dir den Spass da nicht verderben also schaust du besser mal selbst ins manual. Die Reihenfolge deiner Parameter stimmt nicht und $s_pattern_escape könntest du direkt als mit pattern gefülltes Array übergeben.
EDIT:
Egal! Bevor ich morgen nicht mehr an den Thread denke ...
Aber erst reinschauen wenn du keine eigene Lösung findest.
Tipp! Es gibt auch eine bessere Lösung zum escapen der Steuerzeichen - preg_...Spoiler anzeigen
PHP
Alles anzeigen<?php $array = _StringBetween ( "bla hallo blub welt bla universum blub", "bla", "blub" ); print_r ( $array ); function _StringBetween($s_String, $s_Start, $s_End, $i_case = 0) { $s_case = ($i_case == 1) ? "" : "i"; $a_ret = array (); preg_match_all ( "/" . preg_quote ( $s_Start, "/" ) . "(.*?)" . preg_quote ( $s_End, "/" ) . "/s", $s_String, $a_preg, PREG_SET_ORDER ); if (is_array ( $a_preg )) { foreach ( $a_preg as $a_tmp ) { array_push ( $a_ret, $a_tmp [1] ); } } Return $a_ret; } ?>
-
Edit: Hatte SoftCreatR ja schon gepostet und ist das gängige vorgehen für StringBetween in PHP. Das von i2c ist zwar nett anzusehen aber nicht nötig für das was haben willst.
-
Nunja. SoftCreatRs Funktion dürfte nur den ersten Treffer ausliefern. Die Aufgabenstellung war aber, AutoIts _StringBetween() Verhalten nachzubauen
-
Es liefert alle Ergebnisse in einem 0-basierenden Array.
Die Onlinehilfe:
Da fehlt allerdings ein Wörtchen, um das ganze gut verständlich zu machen. -
Danke i2c (und natürlich auch euch anderen)!
Nun, ich bin mit dem Skript fertig; ich bin euch allen sehr dankbar!!
lg tobias -
i2c: Deine Funktion lässt sich noch verbessern:
PHP
Alles anzeigen<?php $array = _StringBetween ( "bla hallo blub welt bla universum blub", "bla", "blub" ); print_r ( $array ); function _StringBetween($s_String, $s_Start, $s_End, $i_case = 0) { $s_case = ($i_case == 1) ? "" : "i"; preg_match_all ( "/" . preg_quote ( $s_Start, "/" ) . "(.*?)" . preg_quote ( $s_End, "/" ) . "/s".$s_case, $s_String, $a_preg, PREG_PATTERN_ORDER ); if (is_array ( $a_preg )) return $a_preg[1]; Return false; } ?>
-
Nunja, aber dann enthält der Rückgabewert wieder nur das erste match. Gewollt war aber ein array of matches wie bei _StrinBetween().
Das preg_match_all() wird so auch unnötig. Wozu alle Übereinstimmungen suchen, wenn am Ende doch nur die Erste zurück gegeben wird.
-
Nunja, aber dann enthält der Rückgabewert wieder nur das erste match. Gewollt war aber ein array of matches wie bei _StrinBetween().
Das preg_match_all() wird so auch unnötig. Wozu alle Übereinstimmungen suchen, wenn am Ende doch nur die Erste zurück gegeben wird.
Nope, ich habe hier PREG_PATTERN_ORDER statt PREG_SET_ORDER eingesetzt. Dadurch hat das Array folgendes Format: $array[$Klammernummer][$Teffernummer]
return $array[$Klammernummer] hat als Ergebnis also das Array $array2[$Ergebnisnummer]