[PHP] Kyrillische wörter in Text finden

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Dark_BROTOSS
Beiträge: 6
Registriert: 18.03.2004, 21:18
Kontaktdaten:

[PHP] Kyrillische wörter in Text finden

Beitrag 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)
Benutzeravatar
donelik
Beiträge: 56
Registriert: 28.11.2006, 17:49
Benutzertext: Will releasen!
Kontaktdaten:

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

Beitrag 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
Ach hör' auf ...
Dark_BROTOSS
Beiträge: 6
Registriert: 18.03.2004, 21:18
Kontaktdaten:

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

Beitrag 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-Обслужващ персонал за Бар
Benutzeravatar
donelik
Beiträge: 56
Registriert: 28.11.2006, 17:49
Benutzertext: Will releasen!
Kontaktdaten:

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

Beitrag 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?
Ach hör' auf ...
Dark_BROTOSS
Beiträge: 6
Registriert: 18.03.2004, 21:18
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
donelik
Beiträge: 56
Registriert: 28.11.2006, 17:49
Benutzertext: Will releasen!
Kontaktdaten:

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

Beitrag 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; 
}
Ach hör' auf ...
Benutzeravatar
Schrompf
Moderator
Beiträge: 4856
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2370
Registriert: 04.08.2004, 20:06
Kontaktdaten:

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

Beitrag 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
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Dark_BROTOSS
Beiträge: 6
Registriert: 18.03.2004, 21:18
Kontaktdaten:

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

Beitrag 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! :)
Antworten