Php Doppelte Wörter
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
browser
code
datenbank
doppel
eingabe
ersetzen
geld
glossar
header
rest
string
tag
teil
text
type
variable echo
variable output
vorkommen
wort
-
Hallo Leute, ich habe ein kleines Problem:
$variable = \"Hier steht <abbr class=\\\"abbr\\\">text</span> text <abbr class=\\\"abbr\\\">text</span> bla bla<abbr class=\\\"abbr\\\">text</span>\";
<abbr class=\"abbr\">text</span> kommt jetzt 3 mal vor
Wir kann ich bewirken, das bis auf das erste <abbr class=\\\"abbr\\\">text</span> die anderen getautscht werden durch <abbr class=\\\"gibtsschon\\\">text</span>
Und es soll auch nur geändert werden, wenn eine komplette Zeichenfolge gleich ist <abbr class=\\\"abbr\\\">text</span> und <abbr class=\\\"abbr\\\">text2</span> sind 2 Paar Schuhe
Ich kenne tag/array">array_unique, aber da ich kein Array sondern nur ne Variable mit nem gespeichertern Wert habe, hab ich keine Ahnung, wie ich das löse...
Kann mir jmd helfen? Wäre bereit dafür zu zahlen!
Beitrag geändert: 22.2.2008 17:18:14 von hirbod -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
entweder machst aus der variable ein array oder du versuchst es mit na datenbank... oder gib mal ein bsp. wo das angewendet werden soll, vllt. versteh ich dann richtig was das werden soll ;)
-
Erklärung:
Ich habe ein Script geschrieben, das ab dem <body> Tag den Text nach Wörtern durchsucht, die in der Datenbank gespeichert sind, und mit <abbr class=\"abbr\">wort aus der datenbank</abbr> ersetzt, wenn diese im Text vorkommen. habe daraus ein glossar gemacht.
Bsp:
Ich habe im Glossar das Wort \"Hans\"
Text: Hans war gestern auf der Hansstraße und hat Hansebraten gegessen
Script macht:
<abbr class=\"abbr\" title=\"Hans bedeutet....(erklärung aus der Datenbank)\">Hans</abbr> war gestern auf der <abbr class=\"abbr\" title=\"Hans bedeutet....(erklärung aus der Datenbank)\">Hans</abbr>straße und hat <abbr class=\"abbr\" title=\"Hans bedeutet....(erklärung aus der Datenbank)\">Hans</abbr>ebraten gegessen
Wenn ich aber jetzt in der Datenbank das Wort \"Hans\" habe, und es in der html Daten die untersucht wird, 10 mal vorkommt, habe ich 10 Tooltips von Hans, und ich will nur, dass das Wort 1 mal mit dem <abbr> Tag ersetzt wird.....
Und ich möchte, das Hans nur 1 mal ersetzt wird, nicht zig fach!
Derjenige der mir zur Lösung verhilft, bekommt ne Sofort-Überweisung von mir. Ich denke 15 € sind fürn kleines Script freundlich :)
ACHTUNG: Mein Script funktioniert schon, es geht nur um das Doppel, also ich brauch jetzt kein Glossar-Script, das hab ich bereits, nur ne erweiterung wie ich die Doppel ersetze, nich lösche..
Beitrag geändert: 22.2.2008 17:44:13 von hirbod -
?
<?php
$variable = \"Hier steht <abbr class=\\\"abbr\\\">text</span> text <abbr class=\\\"abbr\\\">text</span> bla bla<abbr class=\\\"abbr\\\">text</span>\";
$variable = str_replace(\"<abbr class=\\\"abbr\\\">text</span>\",\"<abbr class=\\\"gibtsschon\\\">text</span>\",$variable);
echo $variable;
?>
Output:
Hier steht <abbr class=\"gibtsschon\">text</span> text <abbr class=\"gibtsschon\">text</span> bla bla<abbr class=\"gibtsschon\">text</span>
Und vom Browser:
Hier steht text text text bla blatext -
?
<?php
$variable = \"Hier steht <abbr class=\\\"abbr\\\">text</span> text <abbr class=\\\"abbr\\\">text</span> bla bla<abbr class=\\\"abbr\\\">text</span>\";
$variable = str_replace(\"<abbr class=\\\"abbr\\\">text</span>\",\"<abbr class=\\\"gibtsschon\\\">text</span>\",$variable);
echo $variable;
?>
Output:
Hier steht <abbr class=\"gibtsschon\">text</span> text <abbr class=\"gibtsschon\">text</span> bla bla<abbr class=\"gibtsschon\">text</span>
Und vom Browser:
Hier steht text text text bla blatext
Das ersetzt aber wieder alles, ich will das es ja 1 mal stehen bleibt, und nur der rest danach ersetzt wird.
Müsste man wohl $i++ in ner Schleife mitlaufen lassen, nen Zähler.. aber die Lösung is nich die ich gewünscht hab..
@ xenodez:
<?php function rex_glossar_replace($params) { global $REX, $mypage, $I18N_GLOSSAR; $string = $params[\'subject\']; // Aufteilen des Strings, damit nur im Body ersetzt wird $bodystart = strpos($string, \'<body>\'); $header = substr($string, 0, $bodystart); $body = substr($string, $bodystart); // Bereiche ersetzen, in denen keine Glossar ersetzungen durchgeführt werden sollen // welche nicht innerhalb des Tags sind $back_srch = array (); $back_rplc = array (); $mtchs = array (); if (preg_match_all(\'/(<ul class=\\\"accordion\\\">(.*?)<\\/ul>)/s\', $body, $mtchs) or preg_match_all(\'/(<body id=\\\"noglossar\\\">(.*?)<\\/body>)/s\', $body, $mtchs) or preg_match_all(\'/(<div id=\\\"noglossar\\\">(.*?)<\\/div>)/s\', $body, $mtchs) or preg_match_all(\'/(<h2.*?>(.*?)<\\/h2>)/s\', $body, $mtchs) or preg_match_all(\'/(<h3.*?>(.*?)<\\/h3>)/s\', $body, $mtchs) or preg_match_all(\'/(<span class=\\\"caps\\\">(.*?)<\\/span>)/s\', $body, $mtchs) or preg_match_all(\'/(<div class=\\\"noglossar\\\">(.*?)<\\/div>)/s\', $body, $mtchs)) { foreach ($mtchs[2] as $key => $mtch) { $back_srch[$key] = \'###SPACER###\' . $key . \'###\'; $back_rplc[$key] = $mtch; $body = str_replace($mtch, \'###SPACER###\' . $key . \'###\', $body); } } $sql = new sql; //$sql->debugsql = true; $sql->setQuery(\'SELECT * FROM rex_13_glossar, rex_13_glossar_lang WHERE language = lang_id ORDER BY CHAR_LENGTH(shortcut) DESC\'); // IE doesnt support <abbr> if (strpos($_SERVER[\'HTTP_USER_AGENT\'], \'MSIE\')) { $replacetag = \'acronym\'; } else { $replacetag = \'abbr\'; } $eingaben = \"%desc%\"; $eingaben = str_replace(\'\\\\r\\\\n\', \'\', $eingaben); $replaceformat = \'<\' . $replacetag . \' class=\\\"abbr\\\" onmouseover=\\\"Tip(\\\'\'. $eingaben .\'\\\')\\\" title=\\\"%desc% (%lang%)\\\">%short%</\' . $replacetag . \'>\'; $searches = array (); $replaces = array (); for ($i = 0; $i < $sql->getRows(); $i++) { $language = htmlspecialchars($sql->getValue(\'lang_name\')); $shortcut = htmlspecialchars($sql->getValue(\'shortcut\')); $description = htmlspecialchars($sql->getValue(\'description\')); $casesense = $sql->getValue(\'casesense\'); // Escape Shortcut for preg_match $escapedshortcut = preg_quote($shortcut, \'/\'); $escapedentitiesshortuct = htmlentities($escapedshortcut); if($escapedentitiesshortuct == $escapedshortcut) $search = \'/((<[^>]*)|\' . $escapedshortcut . \')/e\'; else $search = \'/((<[^>]*)|\' . $escapedshortcut . \'|\'. $escapedentitiesshortuct .\')/e\'; $replacer = _rex_glossar_parse_replace_format($replaceformat, array ( \'lang\' => $language, \'desc\' => $description, \'short\' => $shortcut )); $replace = \'\"\\2\"==\"\\1\" && strpos( \"\\1\", \"<\' . $replacetag . \'>\") === false ? \"\\1\":\"\' . $replacer . \'\"\'; if ($casesense == 0) { $search .= \'i\'; } $searches[] = $search; $replaces[] = $replace; $sql->next(); } // Ersetzungen durchführen $body = stripslashes(preg_replace($searches, $replaces, $body)); // Vorher ausgeschlossene Bereiche wieder einpflegen $body = str_replace($back_srch, $back_rplc, $body); $body = str_replace(\'\\\\\', \'\', $body); return $header . $body; } function _rex_glossar_parse_replace_format($replaceformat, $vars) { if (!is_array($vars)) { trigger_error(\'rexAddon[Glossar]: Unexpected type \"\' . gettype($vars) . \'\" for $vars. Expecting type Array!\'); } if (count($vars) == 0) { trigger_error(\'rexAddon[Glossar]: Array $vars must not be empty!\'); } foreach ($vars as $search => $replace) { $replaceformat = str_replace(\'%\' . $search . \'%\', $replace, $replaceformat); } return $replaceformat; } ?>
Beitrag geändert: 22.2.2008 17:54:41 von hirbod -
Sag, kannst du deinen String nicht einfach nochmal in zwei Teile aufteilen?
Dabei ginge der erste Teil bis zur Position des ersten Auftretens des zu ersetztenden Teilstrings zuzüglich dessen Länge.
Der zweite Teil wäre der Rest, welcher die ganzen anderen Vorkommen des Teilstrings enthält. Dort könntest du einfach ersetzen, wie gehabt und am Ende wieder beide Teile zusammenfügen.
Beitrag geändert: 22.2.2008 18:57:46 von xenodez -
Sorry, habe die Frage falsch verstanden.
Bitte niemand mehr Antworten, ich will das Geld.
Schau mal ob du das hier mögen könntest:
<?php $j = 0; $i = 0; $var = \"0;1;1;\"; $text = \"Heute war ein schöner Tag weil Heute war Heute und nicht Morgen\"; $replace = \"Heute\"; $mit = \"Gestern\"; $var = split(\";\", $var); $text2 = split(\" \", $text); while(1) { if($text2[$j] == $replace) { if($var[$i] == 1) { $endtext = $endtext.\" \".$mit; } else { $endtext = $endtext.\" \".$text2[$j]; } $i++; } else { $endtext = $endtext.\" \".$text2[$j]; } $j++; if($text2[$j] == \"\") { break; } } echo $endtext; ?>
In $var legst du mit Nullen und Einser fest welches Wort replaced werden soll. Der Rest sollte selbsterklärend sein. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage