Mit den Beispieldaten sowie einigen chinesischen & japanischen Zeichen scheint die Regex /[!\p{Common}\p{Latin}]*/iu
zu funktionieren. Für weitere Details, diese Seite hat einige schöne Hintergrundinformationen zu predefined Unicode categories sowie eine schöne simple explanation here. Aber es gibt eine leere Übereinstimmung für die nicht-lateinischen Zeichen in dieser Version zurück. Die in meinem EDIT: am Boden wird für saubere Boolesche Logik am besten:
// Set a test array.
$test_array = array();
$test_array[] = 'JóhnDoe';
$test_array[] = 'Fübar';
$test_array[] = 'Lòrem';
$test_array[] = 'FírstNäme';
$test_array[] = '•••••••';
$test_array[] = 'Çákë';
$test_array[] = '形声字/形聲字';
$test_array[] = 'ラドクリフ、マラソン';
// Set the header for debugging output.
header('Content-Type: text/plain; charset=utf-8');
// Roll through the test array.
foreach ($test_array as $test_value) {
// Run a regex to detect latin and common characters.
preg_match('/[!\p{Common}\p{Latin}]*/iu', $test_value, $matches);
// Kludge using array filtering to get rid of empty matches.
$matches = array_filter($matches);
// Dump the matches for debugging.
print_r($matches);
}
Die Ausgabe ist wie folgt: Beachten Sie, wie die chinesischen & japanischen Schriftzeichen leer Streichhölzer zurück. Beachten Sie auch, wie die •••••••
dank der Regex-Übereinstimmung \p{Common}
durchkommt. Wenn Sie nicht wollen, dass gewöhnliche Zeichen wie diese durchkommen, ändern Sie einfach die Regex, /[!\p{Latin}]*/iu
. Ich verwende array_filter
, um diese leeren Werte zu bereinigen, aber es ist kludgy. Das ist also nicht perfekt, aber brauchbar:
Array
(
[0] => JóhnDoe
)
Array
(
[0] => Fübar
)
Array
(
[0] => Lòrem
)
Array
(
[0] => FírstNäme
)
Array
(
[0] => •••••••
)
Array
(
[0] => Çákë
)
Array
(
)
Array
(
)
EDIT: Dieser Test Code verwendet eine Variante des regex ich oben geschrieben die leere Nicht-Spiel Ausgabe oben zu beseitigen; /(?:[\p{Latin}])+/iu
. Beachten Sie, dass dies nur durch Abgleich mit \p{Latin}
funktioniert, so dass \p{Common}
hier nicht gut wiedergegeben werden kann. Aber die Ergebnisse /(?:[\p{Latin}])+/iu
mit sauberen und versichern Sie eine einfache boolean Prüfung von preg_match
verwenden können für Zeichen zu überprüfen, anstatt eine Flickschusterei zu verwenden, zu haben, die mischt die $matches
Array mit array_filter
:
// Set a test array.
$test_array = array();
$test_array[] = 'JóhnDoe';
$test_array[] = 'Fübar';
$test_array[] = 'Lòrem';
$test_array[] = 'FírstNäme';
$test_array[] = '•••••••';
$test_array[] = 'Çákë';
$test_array[] = '形声字/形聲字';
$test_array[] = 'ラドクリフ、マラソン';
// Set the header for debugging output.
header('Content-Type: text/plain; charset=utf-8');
// Roll through the test array.
foreach ($test_array as $test_value) {
// Run a regex to detect latin and common characters.
preg_match('/(?:[\p{Latin}])+/iu', $test_value, $matches);
// Dump the matches for debugging.
print_r($matches);
}
Und die neuen Ergebnisse sind wie folgt.Beachten Sie, dass die leeren Felder wirklich leer sind und die prey_match
ein boolean false
in diesen Fällen zurück:
Array
(
[0] => JóhnDoe
)
Array
(
[0] => Fübar
)
Array
(
[0] => Lòrem
)
Array
(
[0] => FírstNäme
)
Array
(
)
Array
(
[0] => Çákë
)
Array
(
)
Array
(
)
Haben Sie Beispieleingabedaten zum Vergleich? – JakeGould
[[: alpha:]] löst es nicht? –
@AfonsoTsukamoto Probieren Sie es aus. Es passt immer noch chinesische und japanische Charaktere. – JakeGould