Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
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:
Quellcode:$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?

--

zum Seitenanfang zum Seitenende 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.
zum Seitenanfang zum Seitenende Profil || Suche
002
18.02.2005, 16:26
assi



Wenn ich dich richtig verstanden habe, meinst du sowas:
Quellcode:<?
$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:
Quellcode: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.

--

zum Seitenanfang zum Seitenende 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

--

zum Seitenanfang zum Seitenende Profil || Suche
004
18.02.2005, 20:31
Horat



1)
PHP-Quellcode:<?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 <--

zum Seitenanfang zum Seitenende 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.
zum Seitenanfang zum Seitenende 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:
Quellcode:<?
$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:
Quellcode: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.

--

zum Seitenanfang zum Seitenende Profil || Suche
007
19.02.2005, 14:27
CN



wie gesagt:

Zitat:
zur not kannst du die stücke selbst raussuchen und einzeln ersetzen
dazu wirst du wohl unter anderem das brauchen php.net/strstr

--

zum Seitenanfang zum Seitenende Profil || Suche
008
20.02.2005, 13:53
scus



PHP-Quellcode:<?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(0count($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.
zum Seitenanfang zum Seitenende 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

--

zum Seitenanfang zum Seitenende Profil || Suche
010
21.02.2005, 11:26
Chronial



Und jetzt lass es mich mal mit einer musterlösung versuchen:

PHP-Quellcode:<?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-Quellcode:<?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.
zum Seitenanfang zum Seitenende 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.

--

zum Seitenanfang zum Seitenende 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

--

zum Seitenanfang zum Seitenende 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.

--

zum Seitenanfang zum Seitenende Profil || Suche
014
22.02.2005, 15:15
CN



du vergleichst doch grade nicht regexps mit "normalem" sql?

--

zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende Profil || Suche
016
22.02.2005, 19:44
theDon



regular expressions kann man mit finite automatons ausdruecken. sql nicht. punkt.

achja:

PHP-Quellcode:<?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.
zum Seitenanfang zum Seitenende Profil || Suche