Goedemiddag forum leden,

Ik probeer Russische karakters in een formulier inzending te vinden. Maar het lukt me niet om dit voor elkaar te krijgen:

Ik heb een eenvoudig voorbeeld geschreven, maar zelfs dan blijft uitkomst "Geen Russisch". Enig idee waarom?

$my_form_value = "йждил";
$banned_words = "йждил";
$words = explode(',', $banned_words);
foreach ($words as $word) {
	if ( preg_match("/\b".$word."\b/i", $my_form_value) ) {
		echo "Wel Russisch";
	} else {
		echo "Geen Russisch";
	}
}


Update: ik zie dat Russische karakters niet doorkomen, maar mijn variabelen waren iets zoals:
$my_form_value = "abc";
$banned_words = "abc";
Volgens mij zijn ‘abc’ niet alle Russische tekens.

Wel ? = ?
b = ?
en c = s in het Russisch.

Hou er ook rekening meer dat het Russische alfabet double-byte is.

????? ??????????, ???????.

[size=xsmall]Toevoeging op 11/02/2024 20:57:38:[/size]

Haha, dit moderne forum snapt geen buitenlands.
Hoi,

Die abc was een voorbeeld, omdat Russische karakters niet getoond worden hier. Vul hetzelfde willekeurige Russisch woord of letter in bij beide variabelen, dan zul je zien dat mijn code niet werkt. Met abc werkt het natuurlijk wel.

Guido
Misschien met mb_ereg_match?
Met deze code lukt het .

 <?php
$my_form_value = "???";
$banned_words = "???,??????";

$words = explode(',', $banned_words);
echo '<pre>' . print_r( $words, TRUE ) . '</pre>';

foreach ( $words as $word ):
	$pattern = "\b" . $word . "\b";
	echo '<pre>' . $pattern . '</pre>';
	if ( mb_ereg( $pattern , $my_form_value ) ):
		echo "Wel Russisch";
	else:
		echo "Geen Russisch";
	endif;
endforeach;
?>


[size=xsmall]Toevoeging op 11/02/2024 22:45:10:[/size]

En hiermee ook
 if ( mb_ereg_match( $pattern , $my_form_value ) ):
Thanks! Dus heeft met multibytes te maken.. Kun je uitleggen waarom dit blijkbaar multibytes is?

Guido
Proefondervindelijk vastgesteld.
Ik moest van de voornaam en achternaam de eerste letter hebben.

Met een RUS letter lukte dat niet

 substr( $first_name, 0, 2 ) . $last_name; // first 2 characters because of multibyte characters


En later iets in mysql .

 SET @strLENGTH = CHAR_LENGTH(@strINPUT);

en
 SET @strLENGTH = LENGTH(@strINPUT);


geven verschillende lengtes in multibytes.

[size=xsmall]Toevoeging op 12/02/2024 08:29:23:[/size]

In aansluiting op Ward van der Put

https://stackoverflow.com/questions/3212266/detecting-russian-characters-on-a-form-in-php

https://browse-tutorials.com/snippet/check-if-text-contains-cyrillic-characters-php
Of gaat het je, vanwege de $banned_words, vooral om specifieke scheldwoorden en andere beladen termen?

Klopt, om specifieke woorden.

Met deze code lukt het

Ik merk trouwens dat detecteren beter gaat met mb_ereg ipv mb_ereg_match. Niet helder waarom.

Guido
Adoptive Solution op 11/02/2024 20:57:05


Haha, dit moderne forum snapt geen buitenlands.


Ik kan 'm wel eens Russisch, Chinees en weet-ik-veel-wat-nog-meer leren, maar dan moet ik eerst even een mooie testomgeving fixxen voor mijzelf. Maar ik ga er zeker naar kijken. UTF-8 is hier best ruk inderdaad.
Aannemende dat je de tutorial over Unicode al hebt doorgewerkt, weet je dat je voor het herkennen van bepaalde Russische woorden niet hoeft te weten of tekst Russische tekens bevat. Je kunt woorden ook direct vergelijken met Russische woorden uit een Unicode woordenboek.

Doe dat dan wel nadat je de Unicode strings en woorden hebt genormaliseerd, bij voorkeur met Intl::Normalizer.

Of laat het je database doen. Met 1 query scheelt het weer een hoop PHP-code.

Reageren