000
17.02.2005, 22:21
assi
|
Ich will einen Text so bearbeiten, dass jedes zu ersetzende Element durch ein zufälliges anderes Element ersetzt wird. Mit str_replace geht das leider nicht, weil ich $count nur abfragen und nicht setzen kann. Die einzige Möglichkeit, die mir bis jetzt eingefallen ist, ist den text aufzuteilen, sodass nur noch 1 Element pro string da ist, sowas drüber laufen zu lassen:
$random_flame = $flames[rand(0, $flamessize - 1)]; str_replace(":flame:", $random_flame, $text, $count);
Den Text danach wieder zusammenzuflicken und das ganze dann auszugeben. Irgendwie umständlich. Fällt da irgendjemandem was leichtes ein, bzw. gibt es eine Funktion, die bei jedem Ersetzen einen neuen Parameter annimmt?
--
|
|
Profil || Suche
|
001
18.02.2005, 15:19
Horat
|
Tja String-Verkrampfungen, bekommt man schnell... Man muss nur kompliziert denken, schon is alles zu spät.
Also am besten gehst dus ganz einfach an: Was hast du? Einen String, der öfters mal den String ':flame:' enthält. Und du hast (setz ich mal vorraus) ein Array mit elementen.
Was willst du haben? Einen String, der anstelle der ':flame:' ein zufälliges Element hat.
Als erstes füllst du jetz ein Array (ich nenns mal $rnd) mit zufällig angeordneten Elementen, die deine Replaces darstelln sollen. Ich denke, soweit das ersichtlich ist, wäre das bei dir dein $flames Arr. Die Anzahl der Elemente legst du mit subst_count() fest.
Dann machst du einfach nur noch: [php]$puzzle = str_replace (':flame:', $rnd, $text);
Soweit hab ich das verstanden, wenn nich bitte laut schreien und gegen die wand laufen, weil du's so unverständlich erklärt hast.
[edit] btw: Den vierten Parameter gibts bei Str_replace nich. Und außerdem gibt die funktion nen return (Rückgabewert), also kannst du nich einfach die FUnktion aufrufen, sondern mustes so machen wie ichs getan hab. (s.o.)
--
Bild Blog <--
Dieser Beitrag wurde am 18.02.2005 um 15:22 von SEeEL bearbeitet.
|
|
Profil || Suche
|
002
18.02.2005, 16:26
assi
|
Wenn ich dich richtig verstanden habe, meinst du sowas:
<? $text = "Hallo du :flame:! :flame: :flame: :flame: :flame: :flame: "; $flames= array('Nuttenbock', 'Bullensau', 'Dampfnudel', 'Pater Hurensen'); substr_count($text, ":flame:"); $flamessize = 0; foreach ($flames as $wert) { $flamessize++; } //gibts da irgendwas für, z.B. wie bei delphi array.height? $rnd = array(); for($i=0; $i == substr_count($text, ":flame:"); $i++) { $rnd[] = $flames[rand(0, $flamessize - 1)]; } $puzzle = str_replace(":flame:", $rnd, $text); echo $text."</br>"; echo $puzzle;
?> Ausgabe:
Hallo du :flame:! :flame: :flame: :flame: :flame: :flame: Hallo du Array! Array Array Array Array Array
Funktioniert so nicht, ich habe dich wahrscheinlich falsch verstanden.
@edit: Den vierten Parameter gibt es, in die hier gegebene Variable schreibt die Funktion, wie oft der string ersetzt wurde. Wenn man str_replace ohne '=' aufruft, schreibt die Funktion den geänderten Text über den Ausgengstext.
--
|
|
Profil || Suche
|
003
18.02.2005, 16:31
CN
|
zur not kannst du die stücke selbst raussuchen und einzeln ersetzen dazu wirst du wohl unter anderem das brauchen php.net/strstr
--
|
|
Profil || Suche
|
004
18.02.2005, 20:31
Horat
|
1)
<?php substr_count($text, ":flame:"); ?>
Das hat keinen Sinn. Weder Syntaktisch, noch Programmbezogen. (Fast) alle Funktionen haben Rückgabewerte, d.h. das Ergebnis muss einer Variablen zugewiesen werden. Zudem ist die Funktion an der Stelle völlig irrelevant, weil du das Ergebnis erst in der for-Schleife brauchst (so wie dus gemacht hast).
2) Deine foreach-Schleife ist sinnfrei, dafür gibts count(). Das ist auch das Äquivalent für array.height (kenn zwar kein delphi, aber denke mal, dass du des meinst).
3) Schau dir mal genau an wie for funktioniert. Die Bedingung ist ja schon beim ersten durchlauf FALSE. Also wird die Schleife nie durchlaufen. http://www.php.net/manual/de/
4) Was fürn Sinn hat dein gesamtes Script? Interessiert mich jetz mal...
--
Bild Blog <--
|
|
Profil || Suche
|
005
19.02.2005, 12:24
CN
|
zu 1: wieso sollte das syntaktisch keinen sinn machen? ansonsten wird es so trotzdem nicht funktionieren wie du gesagt hast SEeEL die ausgabe bleibt die gleiche für search n string und als replace ein array macht keinen sinn, wie man auch auf php.net nachlesen kann, viel spass dabei
--
Dieser Beitrag wurde am 19.02.2005 um 12:27 von CN bearbeitet.
|
|
Profil || Suche
|
006
19.02.2005, 14:10
assi
|
Argh, bin mal wieder durcheinandergekommen. Bei delphi ist bei einer for Schleife die Abbruchbedingung gegeben. Funktioniert aber trotzdem nicht:
<? $text = "Hallo du :flame:! :flame: :flame: :flame: :flame: :flame: "; $flames= array('Nuttenbock', 'Bullensau', 'Dampfnudel', 'Pater Hurensen'); substr_count($text, ":flame:"); $flamessize = 0; foreach ($flames as $wert) { $flamessize++; } $rnd = array(); for($i = 0; $i < substr_count($text, ":flame:"); $i++) { $rnd[] = $flames[rand(0, $flamessize - 1)]; } echo 'Inhalt von $rnd: '; print_r($rnd); $puzzle = str_replace(":flame:", $rnd, $text); echo "</br>".$text."</br>"; echo $puzzle;
?>
Ausgabe:
Inhalt von $rnd: Array ( [0] => Pater Hurensen [1] => Nuttenbock [2] => Bullensau [3] => Bullensau [4] => Pater Hurensen [5] => Bullensau ) Hallo du :flame:! :flame: :flame: :flame: :flame: :flame: Hallo du Array! Array Array Array Array Array
@CN: Deshalb habe ich auch nach einer Funktion gefragt, die für jedes ersetzen einen neuen Parameter annimmt, dann wäre das alles kein Problem.
@SEeEL: Danke für die Mühe, ich werde es wohl doch irgendwie komplizierter lösen müssen, bzw. lasse es ganz. Ist sowieso nur ne kleine Spielerei.
--
|
|
Profil || Suche
|
007
19.02.2005, 14:27
CN
|
wie gesagt: zur not kannst du die stücke selbst raussuchen und einzeln ersetzen dazu wirst du wohl unter anderem das brauchen php.net/strstr
--
|
|
Profil || Suche
|
008
20.02.2005, 13:53
scus
|
<?php $text = "Hallo :flame:, wie gehts dir? Bla :flame: blub :flame:!"; $flames = array("a", "b", "c"); $text_teile = split(":flame:", $text); $neu_text = $text_teile[0];
for($i = 1; $i < count($text_teile); $i++); $neu_text = $neu_text.$flames[rand(0, count($flames) - 1)].$text_teile[$i]; }
echo $text."<br />"; echo $neu_text; ?>
bin nicht sicher, ob das funktioniert...
--
sincères amitiés scus -- Tand, Tand ist das Gebilde von Menschenhand
Dieser Beitrag wurde am 20.02.2005 um 13:53 von scus bearbeitet.
|
|
Profil || Suche
|
009
20.02.2005, 17:56
assi
|
Wenn man das Semikolon nach der for-Schleife durch { ersetzt funktioniert es. Die Funktion split scheint mir sehr gediegen. Dankeschön
--
|
|
Profil || Suche
|
010
21.02.2005, 11:26
Chronial
|
Und jetzt lass es mich mal mit einer musterlösung versuchen:
<?php $text = "Hallo :flame:, wie gehts dir? Bla :flame: blub :flame:!";
$text = preg_replace_callback ('/:flame:/i','flameCallback',$text);
function flameCallback (){ $flames = array("a", "b", "c"); return $flames[array_rand($flames)]; } ?>
Wenn es ums suchen/ersetzten geht, sind die preg_ funktionen in jeder Hinsicht die mächtigsten. Allerdings musst du dafür den preg syntax lernen - lohnt sich aber eigentlich auf jeden Fall.
*edit ich kanns einfach nicht lassen - hier eine callback-Funktion, die das doppelte auftreten des gleichen flames hintereinander zemlich unwarscheinlich macht:
<?php function flameCallback (){ static $flames = array(); if (empty($flames)){ $flames = array("a", "b", "c"); shuffle($flames); } return array_pop($flames); } ?>
--
"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren
Dieser Beitrag wurde am 21.02.2005 um 11:40 von Chronial bearbeitet.
|
|
Profil || Suche
|
011
21.02.2005, 20:24
assi
|
Mein Gott, du hast echt nichts zu tun... Wer hat sich eigentlich die :flame: Syntax der Regexe ausgedacht? Das hätte man doch schön logisch mit ner Syntax wie mysql lösen können, sowas muss doch nicht wie 1337 aussehen. Mir scheint, ich kenne noch sehr viele sehr nützliche php-Funktionen nicht, muss mich mal noch intensiver damit beschäftigen, hab erst vor 4 Wochen damit angefangen. Knappe 3000 Zeilen "funktionsfähigen" code habe ich dennoch schon verbrochen (kleines Forum + Newsscript), für unsere supertolle Abiseite.
--
|
|
Profil || Suche
|
012
22.02.2005, 13:32
CN
|
in dem beispiel is so ca. gar nicht gebrauch gemacht von der regexp-sprache das einzige was da zusätzlich zum gesuchten string ist, sind die beiden delimiter ich weiss zwar grade nicht was du mit "syntax wie mysql" meinst aber ich sage mal nix kommt an perl(-compatible)-regexps ran
--
|
|
Profil || Suche
|
013
22.02.2005, 13:45
assi
|
Mysql orientiert sich stark an der englischen Sprache, von Regexps kann man das nicht behaupten. Der Therm oben ist natürlich sehr einfach, aber da gibt es schon Therme, die aussehen als seien sie reinstes 1337. Wenn man die Syntax mal gewohnt ist, ist das natürlich alles schön übersichtlich und logisch, aber der Einstieg ist sehr gewöhnungsbedürftig.
--
|
|
Profil || Suche
|
014
22.02.2005, 15:15
CN
|
du vergleichst doch grade nicht regexps mit "normalem" sql?
--
|
|
Profil || Suche
|
015
22.02.2005, 17:10
Chronial
|
Du hast da was falsch verstanden - komplexe regexp ist nie schön übersichtlich und logisch - da kann man sich noch so gut damit auskennen. Das ist aber einfach nicht zu vergleichen mit mysql - mit regexp kannst du ein suchmuster in 30 Zeichen packen, dass zu beschreiben in deutscher Sprache 200 wörter nötig wären, und in einem mysql-mäsigen Syntax wohl 10 Seiten.
Der Vergleich einer Datenbankabfrage mit einem Regulären Ausdruck ist einfach nicht möglich.
--
"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren
|
|
Profil || Suche
|
016
22.02.2005, 19:44
theDon
|
regular expressions kann man mit finite automatons ausdruecken. sql nicht. punkt.
achja:
<?php $text = preg_replace('/:flame:/ei', create_function('', 'static $a = array(\'a\', \'b\', \'c\'); return $a[array_rand($a)];'), $text); ?>
;)
--
\o tanz den naziprau! o/
And more than ever, I hope to never fall, Where enough is not the same it was before
Dieser Beitrag wurde am 22.02.2005 um 19:46 von theDon bearbeitet.
|
|
Profil || Suche
|