PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RegEx will nicht (bei Umlauten?)


mad-boy
23.10.2004, 17:55:10
Hi,
folgender Code soll in Texten nach Namen von Filmen suchen die in einer Datanbank vorhanden sind und diese verlinken, Filmnamen in den Texten sind immer komplett groß geschrieben:


$query = "SELECT `name` FROM filme_index";
$query = mysql_query($query);
while($q = mysql_fetch_array($query)) {
$search[]="/".strtoupper($q['name'])."/";
$replace[]="<a href="/filme/".word2url($q['name'])."/">".strtoupper($q['name'])."</a>";
}


Das klappt soweit ganz gut, z.B. bei Titeln wie "GROSSE HAIE - KLEINE FISCHE". Bei Titeln wie "SHREK - DER TOLLKÜHNE HELD" oder "SHREK 2 - DER TOLLKÜHNE HELD KEHRT ZURÜCK" aber z.B. nicht! Ich gehe davon aus das es an den Umlauten liegt, aber wieso klappt das so nicht?

Gruss, Michael

xabbuh
23.10.2004, 20:03:06
"Klappt nicht", ist keine sehr gute Fehlerbeschreibung.

Außerdem sehe ich keine Zeile, in der ersetzt wird.

mad-boy
23.10.2004, 20:07:27
huups, die Zeile wo ersetzt wird kommt weiter unten:

$text=preg_replace($search,$replace,$text);

und zum Thema klappt nicht: es klappt halt nicht! ^^ bei den einen Filmtiteln setzt er wunderbar den Link hin so wie es sein soll und bei den andern scheint er die Übereinstimmung gar nicht zu finden, auf jeden Fall ist da nirgendswo ein Link im Quellcode! Bin ja selber Ratlos, ich habs jetzt zwar nochmal bei nen paar weiteren Filmen überprüft, aber mehr sagen als es scheint an den Umlauten zu liegen, kann ich leider auch nicht! :( Ich verstehs nicht!

//EDIT: http://www.movie-addict.de/filme/Grosse+Haie+-+Kleine+Fische/ gucks dir selber an! Grosse Haie - Kleine Fische und Findet Nemo wird ersetzt, wunderbar, dagegen aber SHREK - DER TOLLKÜHNE HELD und SHREK 2 - DER TOLLKÜHNE HELD KEHRT ZURÜCK nicht!

xabbuh
23.10.2004, 20:11:47
1. Verwende lieber str_replace() (http://www.php.net/str_replace), da dieses schneller ist.
2. Wandelst du Sonderzeichen mit htmlentities() (http://www.php.net/htmlentities) um, bevor du die Titel ersetzen willst? Du musst natürlich zunächst die Titel in Links umwandeln und anschließend die Sonderzeichen ersetzen, da nach der Umwandlung der Sonderzeichen, diese natürlich nicht mehr gefunden werden.

mad-boy
23.10.2004, 21:10:01
Hi,
str_replace werde ich mal testen, aber: Wozu soll ich die Sonderzeichen mit htmlentities() umwandeln? Die sind sowohl auf der Seite als auch in der Datenbank im original gespeichert und so sollte es auch eigentlich bleiben, sonst bin ich dauernd nur am hin und her wandeln wenn ich die wieder irgendwo auslesen will! ^^

//EDIT: str_replace funktioniert genauso, Titel mit Umlauten werden nicht ersetzt, der Rest schon!

xabbuh
23.10.2004, 21:40:21
Original geschrieben von mad-boy
Wozu soll ich die Sonderzeichen mit htmlentities() umwandeln?
Du solltest Sonderzeichen in den entsprechenden HTML-Code umwandeln, damit deine Seite auch von Leute betrachtet werden kann, die nicht unbedingt den gleichen Zeichensatz wie du nutzen: Zeichenvorrat, Sonderzeichen und HTML-eigene Zeichen (http://de.selfhtml.org/html/allgemein/zeichen.htm)

str_replace funktioniert genauso, Titel mit Umlauten werden nicht ersetzt, der Rest schon!
Dann zeig mal etwas mehr von deinem Script.

mad-boy
23.10.2004, 22:04:54
Ich hab im HEAD Bereich aber den Zeichensatz drin stehen! ^^ Aber naja von mir aus jag ich noch nen HTML-Parser über die kompletten Inhalte! ^^

also das gesamte Script ist in meiner BBCode Funktion drin:


function bbcode($text) {

//HTML Tags entfernen
$text=str_replace("<","&lt;",$text);
$text=str_replace(">","&gt;",$text);

$text=nl2br($text); //Im restlichen Code <BR>'s einfügen

$query = "SELECT `name` FROM filme_index";
$query = mysql_query($query);
while($q = mysql_fetch_array($query)) {
$s_titel[]=strtoupper($q['name']);
$r_titel[]="<a href="/filme/".word2url($q['name'])."/">".strtoupper($q['name'])."</a>";
}
$text = str_replace($s_titel,$r_titel,$text);

//Suchstrings für restlichen Code:
$search[]="/(.*?)/si";
$search[]="/(.*?)/si";
$search[]="/(.*?)/si";
$search[]="/(.*?)/si";
$search[]="/(.*?)/si";
$search[]="/(.*?)/si";
$search[]="/(.*?)/si";
$search[]="/(.*?)/si";

//Replacestrings für restlichen Code:
$replace[]="<a href="1" target="_blank">1</a>";
$replace[]="<a href="1" target="_blank">2</a>";
$replace[]="<a href="mailto:1" target="_blank"><img src="/template/".$_SESSION['template']."/mail.gif" border=0>1</a>";
$replace[]="<a href="mailto:1" target="_blank"><img src="/template/".$_SESSION['template']."/mail.gif" border=0>2</a>";
$replace[]="<B>1</B>";
$replace[]="<U>1</U>";
$replace[]="<I>1</I>";
$replace[]="<img src="1" border=0>";

$text=preg_replace($search,$replace,$text); //Restlichen Code ersetzen

return $text;
}


Viel mehr gibts da auch nicht! Als Beispiel wie der Text dann geparst wird:


$select = "SELECT * FROM news WHERE `id`='".$_GET['id']."'";
$select = mysql_query($select);
$e = mysql_fetch_array($select);

$tpl->setVariable(array(
"headline"=>$e['headline'],
"text"=>bbcode($e['text']),
"datum"=>strftime("%d.%m.%Y",strtotime($e['datum'])),
"quelle"=>$e['quelle']
));


Es ist eben wirklich nicht viel an Script, deswegen versteh ich nicht was der da macht! Werden Umlaute beim auslesen aus einer MySQL Tabelle vielleicht irgendwie anders ausgelesen oder so?