Seite 1 von 1

[PHP] Kyrillische wörter in Text finden

Verfasst: 05.01.2012, 11:01
von Dark_BROTOSS
Ich bin kurz vorm verzweifeln... in einem Kyrillischen Text, soll ein Wort gefunden werden "suchfunktion", allerdings zeigt er mir auch unterschiedliche längen an?!?!?!

Code: Alles auswählen

48-Обслужващ персонал за Бар
47-Обслужващ персонал за Бар
(vorneran die strlen)
1. zeile gesuchtes wort (bereits mit trim bearbeitet)
2. zeile der inhalt in dem gesucht werden soll, zu testzwecken steht hier nur exakt das wort drin...!

mit convert_cyr_string kam ich nicht weiter, die schrift ist allerdings auch bulgarisch, kein russisch!

jemand eine idee?

der Text (in dem gesucht werden soll) wird über Joomla 1.5 eingetragen, die suche ist eine eigene PHP datei im Notepad geschrieben (hier sind die Suchstrings vordefiniert nach denen gesucht werden kann, Codierung UTF8)

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 05.01.2012, 11:50
von donelik
Hiho,

probiers mal mit

http://de.php.net/manual/de/function.mb-strlen.php

Welche Funktion nutzt du zur Suche? Sicherlich gibt es davon ebenfalls eine MultiByte-Variante.

VG
DonElik

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 05.01.2012, 14:09
von Dark_BROTOSS
besten dank!

die Multibyte variante war mir völlig entfallen bzw. warum funktioniert es damit?

mittels mb_strlen ist der vergleich positiv, mit stristr bzw. mb_stristr suche ich in dem text, aber auch jetzt findet er den eintrag nicht:

Code: Alles auswählen

25-Обслужващ персонал за Бар
25-Обслужващ персонал за Бар

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 05.01.2012, 15:32
von donelik
Hm bei mir klappt alles mit meinen UTF8-Tests. Kannst du mal Code zeigen? Keine Unterstellung sondern nur eine Vermutung: Behandelst du die Rückgabe von mb_stristr korrekt?

Im "Normalbetrieb" arbeitet PHP mit 1-Byte je Zeichen. UTF8 und Co. sind aber Mehr-Byte-Zeichensätze.

http://www.php.net/manual/en/intro.mbstring.php

Beispiel: Das Zeichen "Б" (http://de.wikipedia.org/wiki/%D0%91) hat unter UTF8 16 Bits -> 11010000:10010001

Wenn du jetzt eine Funktion drüber laufen lässt die davon ausgeht dass ein Zeichen nur 8 Bits hat, denkt die Funktion es wären 2 Zeichen ...


Jetzt mal was für mein Allgemeinwissen: Gibt es im Kyrillisches Alphabet Groß-/Kleinschreibung?

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 06.01.2012, 09:06
von Dark_BROTOSS

Code: Alles auswählen

$s = array(1=>"Танцьорка","Обслужващ персонал за Бар","Еротична актриса-филм","Само ескорт /Хотел или приват","Компаньонка с консумаци","Други");

if(count($_POST['land'])>0){
foreach($_POST['land'] as $w){
if(mb_stristr($ex[1],$w)){ $jo=1; }
}
}

if(count($_POST['job'])>0){
foreach($_POST['job'] as $w){
//echo mb_strlen($s[$w])."-".$s[$w]."---".mb_strlen($ex[1])."-".$ex[1]."<br />";
if(mb_stristr($ex[1],$s[$w])){ $jo=1; }
}
}

if($_POST['land'][0]=="all"){$jo=1;}
if($_POST['job'][0]=="all"){$jo=1;}
kurze erläuterung, die suchfelder sind checkboxen, sollte eine angeklickt sein ist der count größer und es muss geprüft werden ob die angeklickten werte bzw. einer in dem string vorkommen, die suche nach dem Land funktioniert komischerweise sehr gut, nur die nach den jobs (längere worte) nicht.
um die doppelte übergabe zu vermeiden hab ich bereits die kyrillischen worte aus dem value genommen und nur einen zeiger eingegeben der auf das kyrillische wort innerhalb der datei zeigt array $s

kurzer auszug aus der suche:
<input type="checkbox" name="job[]" value="2" /> Обслужващ  персонал за Бар<br />
<input type="checkbox" name="job[]" value="3" /> Еротична актриса-филм<br />
<input type="checkbox" name="job[]" value="4" /> Само ескорт /Хотел или приват<br />
die datei ist im notepad erstellt und wird mit utf8 gespeichert

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 06.01.2012, 10:27
von donelik
Hiho,

hmm da spricht erstmal nix gegen funktionstüchtigkeit.

Mein Code funktioniert auch (ohne zu Wissen was in "ex" drin steht). Ich geb dir mal mein lauffähiges Beispiel:

Code: Alles auswählen

<?php
	$s = array(
		1 => "Танцьорка",
		"Обслужващ персонал за Бар",
		"Еротична актриса-филм",
		"Само ескорт /Хотел или приват",
		"Компаньонка с консумаци",
		"Други"
	);
		
	$strTest1 = "амамамамамамамамамамЕротична актриса-филмцинсонсонсонсонсон";

	$jo=0;
    if(count($_POST['job']) > 0)
	{
		foreach($_POST['job'] as $w)
		{
			//echo mb_strlen($s[$w])."-".$s[$w]."---".mb_strlen($ex[1])."-".$ex[1]."<br />";
			if(mb_stristr($strTest1, $s[$w]))
			{ 
				$jo=1; 
			}
		}
    }

    if($_POST['job'][0] == "all")
	{
		$jo=1;
	}
	
	echo $jo;
	
	echo '<br><br>';
	echo '<form action="test.php" method="post">';
	echo '<input type="checkbox" name="job[]" value="2" /> Обслужващ  персонал за Бар<br />';
	echo '<input type="checkbox" name="job[]" value="3" /> Еротична актриса-филм<br />';
	echo '<input type="checkbox" name="job[]" value="4" /> Само ескорт /Хотел или приват<br />';
	echo '<input type="submit" />';
	echo '</form>';
?>
Sollte das nicht helfen, kannst du ja mal erläutern was "ex" ist und zeigen was drin steht.

Noch ein Hinweis: Achte auf Typenprüfung! "0" wird nach false "umgewandelt"! Sicherer wäre das hier:

Code: Alles auswählen

if(false === mb_stristr($text, $suche))
{ 
	$gefunden = false; 
}
else
{
	$gefunden = true; 
}

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 06.01.2012, 11:29
von Schrompf
Ich habe zwar keine Ahnung von PHP, aber zu Notepad eine Warnung: prüfe unbedingt nach, ob die Files wirklich UTF8 sind. Nach meinem Wissen nutzt Notepad von Haus aus irgendwas absurdes - Widechars oder UTF16 oder wasweißich. Am Ende könnte es ganz banal an abweichenden Encodings liegen, dass die String-Vergleiche immer fehlschlagen.

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 06.01.2012, 12:58
von Jonathan
Was mir noch dazu einfällt:
Ein Textvergleich von Unicode-Strings ist eines der komplexesten, was es im Unicode Standard gibt (noch komplexer als BiDi!). Der (aktuelle) Textvergleich wird durch den "Unicode Technical Standard #10 (Unicode Collation Algorithm)" definiert. Ausgedruckt ergibt dies bei mir ca. 78 DIN A4 Seiten.
http://www.c-plusplus.de/forum/161855

Ich kann mir sehr gut vorstellen, dass längst nicht alle Bibliotheksfunktionen den kompletten Unicode Standard implementieren. Das er untershciedliche Längen anzeigt, spricht sehr dafür, denn wie im Artikel beschrieben gibt es oft sehr viele Alternativen den selben Text in unicode darzustellen (auch mit unterschiedlich vielen Bytes). Also, viel Glück :D

Re: [PHP] Kyrillische wörter in Text finden

Verfasst: 09.01.2012, 07:38
von Dark_BROTOSS
letzten freitag hat donelik (hier nochmal besten dank dafür) sich nochmal die mühe gemacht und das problem genauer untersucht,

Lösung: die Leerzeichen

in dem Kyrillischen String waren ebenfalls kyrillische Leerzeichen, in meiner Suchstring allerdings durch die Notepad Formatierung UTf8 Leerzeichen, daher passte hier nicht der match! Ich habe die Leerzeichen neu eingetippt und siehe da, es funktioniert :)

Donelik hat sich die Strings im Hexeditor angesehn wodurch die unterschiedliche Codierung zu sehn war, klasse! :)