php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Löschen / Ersetzen von - bis


 
ollimagic
15-12-2008, 23:29 
 
Hallo. Gibt es eine Funktion, mit der ich etwas aus einem Text mit php etwas automatish herauslöschen kann?
zum Beispiel Text:
<br /><a href="zujzujzujz.fr">uiik </a>testtesttest und was noch so drinsteht alles unterschiedlich</td></tr>
zu ersetzen mit<br /></td></tr>

 
unset
15-12-2008, 23:32 
 
str_replace?

 
ollimagic
15-12-2008, 23:35 
 
Ja, aber damit kann ich ja nur definiertes ersetzen. Ich will entweder alles davor oder alles danach rausschmeißen

 
asp2php
15-12-2008, 23:36 
 
dann nimm preg_replace().

 
unset
15-12-2008, 23:37 
 
Dann solltest du dich evtl. klarer ausdrücken. Regular Expressions sind das, was du suchst.

 
ollimagic
15-12-2008, 23:50 
 
Das geht auch nicht.
Es soll ab einer bestimmten Zeichenkette bis zu einer bestimmten Zeichenkette alles gelöscht werden

 
unset
16-12-2008, 00:07 
 
Doch, das geht mir Regular Expressions!

 
asp2php
16-12-2008, 00:11 
 
Original geschrieben von ollimagic
Das geht auch nicht.
Es soll ab einer bestimmten Zeichenkette bis zu einer bestimmten Zeichenkette alles gelöscht werden

Natürlich geht das, zeige, was du mit RegEx versucht hast!

 
PHP-Desaster
16-12-2008, 00:15 
 
Oder alternativ mit strpos und substr.

 
ollimagic
16-12-2008, 00:25 
 
Ist ja nicht immer gleich lang. RegEx verstehe ich gar nicht was gemeit ist und parse_str hat auch nicht geklappt.

 
Griecherus
16-12-2008, 00:28 
 
Original geschrieben von ollimagic
Ist ja nicht immer gleich lang. RegEx verstehe ich gar nicht was gemeit ist und parse_str hat auch nicht geklappt.
Müde? :)

Hier (http://www.regular-expressions.info/) eine meiner Meinung nach sehr gute Ressource zu Regulären Ausdrücken (Regular Expressions). Die Thematik ist zugegeben nicht ohne, aber von äußerst großem Nutzen, wenn du die Materie erstmal beherrschst. Reguläre Ausdrücke erlauben dir nämlich Mustersuchen und -Ersetzungen.


Grüße

 
ollimagic
16-12-2008, 00:59 
 
Ja, müde bin ich auch noch dazu.
Ich denke das preg_replace wohl doch das beste ist, aber im Moment weiss ich nicht, wie ich das am besten einsetze.

Was da zu löschen ist wäre alles von:
<td> bis zu <img border=
und alles nach:
<strong> bis zu </a></td>
Wie ich alles dazwischen lösche habe ich nun schon rausgefunden allerdings löscht es dann auch die Sachen, die ich als Eingabe habe wie z.B. </a></td>
Ich werde mal drüber schlafen, vielleicht fällt mir noch etwas ein.

 
MarkusW
19-12-2008, 13:21 
 
Generell lässt sich ein solches Problem am einfachsten mit RegEx lösen (wenn man sich damit auskennt). Allerdings sollte man immer nach einer anderen Lösung suchen, da RegEx zwar schön zu verwenden ist, aber von der Performance her ziemlich langsam werden kann, vor allem, wenn man mit großen Datenmengen arbeitet.

Dieses Problem lässt sich auch so lösen:

function replaceFromTo($from, $to, $replace, $text){
if (!is_array($from)) $from = array($from);
if (!is_array($to)) $to = array($to);
if (!is_array($replace)) $replace = array($replace);
if (count($from) == 0 || count($to) == 0 || count($replace) == 0)
return $text;

foreach($from as $i => $start){
$end = $to[min($i, count($to) - 1)];
$rep = $replace[min($i, count($replace) - 1)];
$posStart = strpos($text, $start);
if ($posStart !== false) {
$posEnd = strpos($text, $end, $posStart);
if ($posEnd !== false) {
$text = substr($text, 0, $posStart + strlen($start))
. $rep . substr($text, $posEnd);
}
}
}

return $text;
}

function deleteFromTo($from, $to, $text){
return replaceFromTo($from, $to, '', $text);
}

echo replaceFromTo('XXX', 'YYY', 'z', 'aaaXXXaaaYYYaaa'); // aaaXXXzYYYaaa
echo deleteFromTo('XXX', 'YYY', 'aaaXXXaaaYYYaaa'); // aaaXXXYYYaaa

Mit RegEx geht das natürlich kürzer:
echo preg_replace('@(XXX)(.*?)(YYY)@s', '$1$3', 'aaaXXXaaaYYYaaa'); // aaaXXXYYYaaa

 
Griecherus
19-12-2008, 13:54 
 
Original geschrieben von MarkusW
Generell lässt sich ein solches Problem am einfachsten mit RegEx lösen (wenn man sich damit auskennt). Allerdings sollte man immer nach einer anderen Lösung suchen, da RegEx zwar schön zu verwenden ist, aber von der Performance her ziemlich langsam werden kann, vor allem, wenn man mit großen Datenmengen arbeitet.

Dass man immer nach einer anderen Lösung suchen sollte, würde ich nicht so stehen lassen wollen. Solche Mustersuchen können durchaus ihre Kosten an die Performance eines Skripts stellen, so, wie bereits gesagt, z.b. bei größeren Textmengen, insbesondere aber, wenn die Muster komplizierter werden und (zudem) suboptimal gebaut sind. Nichtsdestotrotz haben sie ihren Nutzen, für den sie konzipiert worden sind und sind eben nicht notwendigerweise (!) langsamer, als andere Herangehensweisen. Beispielsweise läuft deine Funktion nach einigen simplen Messungen langsamer als die Ersetzung mittels preg_replace. Zudem bedarf es einem gewissen Arbeitsaufwand, jede x-beliebige Funktionalität, die ein spezifischer Regulärer Ausdruck bieten würde, entsprechend mit String-Funktionen zu umschreiben (was wiederum Zeit kostet). Ich denke man sollte eher abwägen, wann es angemessen hinsichtlich der Optimalität ist und wann nicht. Und für dieses Beispiel würde ich zur Regex greifen.


Grüße


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:29 Uhr.