Тест, если строка содержит только буквы (a-z + é ü ö ê å ø и т.д.)

Мне не удалось воспроизвести проблему, которую вы описали, используя ваш пример проекта. Я могу показать и удалить фрагмент независимо от того, переключаю я цвет строки состояния или нет.

Также возможно, что причина, по которой это вызывает ошибки, заключается в том, что вы не применяете / не удаляете другие флаги, упомянутые в документации setStatusBarColor() . Попробуйте это:

// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));

Как ни странно, я смог воспроизвести проблему, которую вы описали после попытки кода выше, что делает его еще более запутанным.

Поэтому я рекомендую альтернативный подход - использовать CoordinatorLayout вместо окна для рисования цвета строки состояния. Сделайте CoordinatorLayout прямым потомком DrawerLayout и добавьте к нему android:fitsSystemWindows="true". Тогда вместо того, чтобы звонить window.setStatusBarColor(), звоните coordinatorLayout.setStatusBarBackgroundColor(). Это решение не требует каких-либо специальных оконных флагов, но обратите внимание, что для того, чтобы это работало, вам также необходимо добавить следующую строку в тему:

@android:color/transparent

Я также использую CoordinatorLayout в большом проекте для динамического изменив цвет строки состояния, так что, надеюсь, она подойдет и вам. Это определенно работает в примере проекта.

30
задан patad 30 May 2012 в 06:37
поделиться

9 ответов

Я не знаю фактической причины для этого, но если вы хотите использовать его в качестве предварительной проверки, скажем, имен входа или псевдонимов пользователей, я бы посоветовал вам вводить символы самостоятельно, а не используйте целые буквы «альфа», которые вы найдете в юникоде, потому что вы, вероятно, не найдете оптической разницы в следующих буквах:

А ≠ A ≠ Α  # cyrillic, latin, greek

В таких случаях лучше указывать разрешенные буквы вручную, если Вы хотите минимизировать подделку аккаунта и тому подобное.

Добавление

Ну, если это поле, которое должно быть неуникальным, я бы тоже разрешил греческий. Я не чувствую себя хорошо, когда заставляю пользователей менять свое имя на латинизированную версию.

Но для уникальных полей, таких как псевдонимы, нужно дать подсказку другим посетителям сайта, что это действительно псевдоним, который, по их мнению, так и есть. Плохо, что люди уже подделывают аккаунты, меняя меня и меня. Конечно, это зависит от ваших пользователей; но, чтобы быть уверенным, я думаю, что лучше разрешить только латинский + диакритический знак (Может быть, посмотрите на этот список: Latin-производный_алфавит )

В качестве непроверенного предложения (с '-', '_' и ''):

/^[a-zA-Z\-_ ’'‘ÆÐƎƏƐƔIJŊŒẞÞǷȜæðǝəɛɣijŋœĸſßþƿȝĄƁÇĐƊĘĦĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊIJĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịijĵķƙĸĺļłľŀʼnńn̈ňñņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ]$/.test(myString)

Другое редактирование: Я добавил апостроф для людей с такими именами, как О'Нил или О'Рейли. (И прямой и обратный апостроф для людей, которые не могут правильно войти в кудрявый.)

32
ответ дан Debilski 27 November 2019 в 23:05
поделиться

Вы не можете сделать это в JS. У него очень ограниченная поддержка регулярных выражений и нормализаторов. Вам нужно было бы создать длинный и не поддерживаемый массив символов с всеми возможными латинскими символами с диакритическими знаками (я думаю, что существует около 500 различных). Скорее делегируйте задачу проверки стороне сервера, которая использует другой язык с большими возможностями регулярного выражения, если это необходимо, с помощью ajax.

В полноценной среде регулярных выражений вы можете просто проверить, соответствует ли строка \p{L}+. Вот пример Java :

boolean valid = string.matches("\\p{L}+");

В качестве альтернативы, вы также можете нормировать текст, чтобы избавиться от диакритических знаков и проверить, содержит ли он только [A-Za-z]+. Вот снова пример Java :

string = Normalizer.normalize(string, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
boolean valid = string.matches("[A-Za-z]+");

PHP поддерживает аналогичные функции.

11
ответ дан BalusC 27 November 2019 в 23:05
поделиться

Вы можете использовать черный список - список символов для исключения.

Кроме того, важно проверить ввод на стороне сервера, а не только на стороне клиента! Клиентская сторона может быть легко обойдена.

4
ответ дан Frunsi 27 November 2019 в 23:05
поделиться

Я использую конвертер перед проверкой, но он все еще не подходит для всех языков. Я не уверен, что это возможно.

function noExtendedChars( input_name ){

    var whitelist = [
        ['a',  'à','á','â','ä','æ','ã','å','ā'],
        ['c',  'ç', 'ć', 'č'],
        ['e',  'è','é','ê','ë','ē','ė','ę'],
        ['i',  'ï','ï','í','ī','į','î'],
        ['l',  'ł'],
        ['n',  'ñ', 'ń'],
        ['o',  'ô', 'ö', 'ò', 'ó', 'œ', 'ø', 'ō', 'õ' ],
        ['s',  'ß', 'ś', 'š' ],
        ['u',  'û', 'ü', 'ù', 'ú', 'ū'],
        ['y',  'ÿ'],
        ['z',  'ž', 'ź', 'ż']
        ];

    for( b=0; b < blacklist.length; b++ ){
        var r=  blacklist[b];
        for ( a=1; a < r.length; a++ ){
            input_name = input_name.replace( new RegExp( r[a], "gi") , r[0]);
        }
    }
    return input_name;

}
2
ответ дан Joeri 27 November 2019 в 23:05
поделиться
[

] Должны быть, но регекс будет зависеть от локализации. Таким образом, []ü ö к к ø [] не будет отфильтровываться, если вы, например, находитесь на американской локализации. Чтобы гарантировать, что ваш веб-сайт делает то, что вы хотите во всех локализациях, вы должны явно выписать символы в форме, похожей на ту, что вы уже делаете.[

] [

]Единственный стандарт, о котором я знаю, это []\w[], который будет соответствовать всем буквенно-цифровым символам. Вы можете сделать это "стандартным" способом, запустив два регекса, один для проверки соответствия []\w[], а другой для проверки, что []\d[] (все цифры) не совпадают, в результате чего получится гарантированная альфа-строка. Опять же, я настоятельно рекомендую вам не использовать эту технику, так как нет никакой гарантии, что []\w[] будет представлено в заданной локализации, но это действительно ответ на ваш вопрос.[

].
7
ответ дан 27 November 2019 в 23:05
поделиться
[

] Я ничего не знаю о Javascript, но если он имеет правильную поддержку юникода, конвертируйте вашу строку в разложенную форму, затем удалите из нее диакритические знаки ([][\u0300-\u036f\u1dc0-\u1dff][]). Тогда ваши буквы будут только ASCII.[

].
6
ответ дан 27 November 2019 в 23:05
поделиться
[

] Есть несколько ярлыков для достижения этого на других диалектах регулярных выражений - см. [] эту страницу []. Но я не верю, что в JavaScript есть какие-то стандартизированные - конечно, не это поддерживается всеми браузерами.[

].
2
ответ дан 27 November 2019 в 23:05
поделиться

Это может быть сложно, к сожалению, JavaScript имеет довольно слабую поддержку интернационализации. Для этого нужно создать свой собственный класс символов. Это связано с тем, что, например, \w аналогичен [0-9A-Z_a-z], что не сильно поможет и в Javascript нет ничего похожего на [[:alpha:]]. Но так как это звучит так, как будто вы собираетесь использовать только один другой лангуст, вы, вероятно, можете просто добавить эти другие символы в свой класс символов.

Кстати, я думаю, вам понадобится ? или * в вашем регэкспрессе, если мойString может быть длиннее одного символа.

Полный пример,

/^[a-zA-Zéüökåø]*$/.test(myString);

8
ответ дан 27 November 2019 в 23:05
поделиться

Можно использовать черный список вместо белого. Таким образом, вы удалите только те символы, которые вам не нужны.

6
ответ дан 27 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: