С учетом URL-адреса для анализа:
URL url = new URL("https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback");
Это решение собирает список пар:
List<AbstractMap.SimpleEntry<String, String>> list =
Pattern.compile("&").splitAsStream(url.getQuery())
.map(s -> Arrays.copyOf(s.split("="), 2))
.map(o -> new AbstractMap.SimpleEntry<String, String>(decode(o[0]), decode(o[1])))
.collect(toList());
Это решение с другой стороны, собирает карту (учитывая, что в URL-адресе может быть больше параметров с одним и тем же именем, но с разными значениями).
Map<String, List<String>> list =
Pattern.compile("&").splitAsStream(url.getQuery())
.map(s -> Arrays.copyOf(s.split("="), 2))
.collect(groupingBy(s -> decode(s[0]), mapping(s -> decode(s[1]), toList())));
Оба решения должны использовать служебную функцию для правильного декодирования параметров.
private static String decode(final String encoded) {
try {
return encoded == null ? null : URLDecoder.decode(encoded, "UTF-8");
} catch(final UnsupportedEncodingException e) {
throw new RuntimeException("Impossible: UTF-8 is a required encoding", e);
}
}
Я думаю, что проблема намного проще: вы забыли указать модификатор u
. Свойства символа Юникода: доступны только в режиме UTF-8 .
Ваше регулярное выражение должно быть:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
Прежде всего, ваша жизнь будет намного проще, если вы будете использовать одиночные апострофы вместо двойных кавычек при написании их - вам нужна только одна обратная косая черта. Во-вторых, следует также включить сочетание меток \pM
. Если вы найдете символ, который не соответствует, пожалуйста, узнайте его кодовую точку Юникода, а затем вы можете использовать http://www.fileformat.info/info/unicode/ , чтобы выяснить, где он находится. Я нашел http://hsivonen.iki.fi/php-utf8/ бесценным инструментом при отладке с помощью свойств UTF-8 (не забудьте перевести его в шестнадцатеричный код перед попыткой поиска: array_map('dechex', utf8ToUnicode($text))
).
Например, Ă окажется http://www.fileformat.info/info/unicode/char/0102/index.htm и будет в Лу, и поэтому L должен соответствовать ему, и он подходит для меня. Другой символ - http://www.fileformat.info/info/unicode/char/5f20/index.htm , а также isLetter и действительно подходит для меня. У вас есть таблицы символов Unicode, скомпилированные в?
Если вы хотите заменить Unicode old pattern
на new pattern
, вы должны написать:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
Таким образом, ключ здесь - u
модификатор
Примечание: ваш сервер php version
shoud будет как минимум PHP 4.3.5
, как указано здесь php.net | Модификаторы паттерна
u (PCRE_UTF8) Этот модификатор включает дополнительные функции PCRE, которые несовместимы с Perl. Строки шаблонов рассматриваются как UTF-8. Этот модификатор доступен с PHP 4.1.0 или выше в Unix и с PHP 4.2.3 на win32. UTF-8 справедливость шаблона проверяется с PHP 4.3.5.
blockquote>Спасибо
AgreeOrNot
, которые дают мне этот ключ здесь preg_replace сопоставить целое слово в арабскомЯ пробовал это, и он работал в localhost, но когда я пытаюсь его на удаленном сервере, это не сработало, и я обнаружил, что php.net начинает использовать модификатор
u
в PHP 4.3.5. , Я обновляю версию php и работает. Важно знать, что этот метод очень полезен для арабских пользователей (عربي), потому что, как я считаю, unicode - лучший кодировщик для арабского языка, а замена не будет если вы не используете модификатор
u
, см. следующий пример, он должен работать с вами
$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);
$namePattern = '/^[\pL]$/'; $a = '张'; var_dump(preg_match($namePattern, $a)); $a = '张1'; var_dump(preg_match($namePattern, $a));
и варианты. Это работает для меня без u. PHP 5.3.2-1ubuntu4.7 – chx 13 February 2011 в 10:42int(0)
. Вероятно, ваш файл не закодирован с использованием UTF-8. – NikiC 13 February 2011 в 10:47u
. Последующий вопрос: что именно указываетu
, точно? Поскольку мой шаблон безu
по-прежнему совпадает с ASCII, я предполагаю, что он говорит регулярному выражению о характере входной строки, а не о самом шаблоне. – Jeff Lee 13 February 2011 в 19:43