![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Добрый вечер! Скажите пожалуйста вот мне нужно написать регулярное выражение которое скажет - есть ли в строке хотя бы одно слово которое начинается с прописное русской буквы и заканчивается тоже прописной русской ...
Почему не работает вот такая запись?
На сколько я понимаю это - слово начинается с прописной русской буквы (одна или более раз), затем следует любой символ кроме пробела, и заканчивается одним прописным символом русского алфавита ... |
|||
|
||||
| enoff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 30.6.2010 Где: Санкт-Петербург Репутация: 11 Всего: 13 |
вам нужно чтобы одно и то же слово начиналось и оканчивалось на прописные строчные, или разные слова?
^$ - соответствуют началу и концу строки. [а-я]+ - 1 и больше строчных русских букв. [\S]* - любое количество (в том числе и 0) непробельных символов. [а-я] - одна строчная русская буква. Паттерн совсем не соответствует условию. Добавлено через 1 минуту и 20 секунд Проблема в символах привязки к началу и концу строки. Так как строка содержит пробелы, а в паттерне указано, что не может. вместо \S в данном случае лучше использовать \w - цифробуквенные символы, или вообще [а-я]. |
|||
|
||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Я сделал по другому, разбил строку на слова ... и конретно к каждому слову применю вот такой шаблон:
Все вроде хорошо, но вот такая строка - "- Ну-у-у… - озадачилась я, - Не помню уже.", не подходит ... хотя слово - "озадачилась" то что нам нужно. Вот функция:
получает строку, разбивает на слова и проверяет каждое слово, если хоть одно слово встретилось то все ок .. иначе false p.s. на сколько я понимаю прописные - это маленькие буквы) да? |
||||
|
|||||
| enoff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 30.6.2010 Где: Санкт-Петербург Репутация: 11 Всего: 13 |
Не нужно ничего разбивать на слова.
Самое простое решение у меня не работает с юникодом и русскими буквами, с английским все впорядке. Попробуйте.
Добавлено через 58 секунд 4epT, Прописные = ЗАГЛАВНЫЕ, строчные = маленькие. |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Да, это решение намного красивее ...
А скажите пожалуйста возможно регулярным выражением перевести все четные слова состоящие из английских символов в верхний регистр ? |
|||
|
||||
| enoff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 30.6.2010 Где: Санкт-Петербург Репутация: 11 Всего: 13 |
Менее красивее + ненавистный глобал |
|||
|
||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Можешь в кратце объяснить как оно работает?) а именно вот это - "#\b[a-z]+\b#i", что тут значит # |
||||
|
|||||
| enoff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 30.6.2010 Где: Санкт-Петербург Репутация: 11 Всего: 13 |
4epT, # - ограничители паттерна. После ограничителей идут модификаторы.
У тебя используется "/". Мне привычнее решетки) #\b[a-z]+\b#i - соответствует слову. preg_replace_callback вызывает для каждого найденного совпадения callback функцию. Т.е. с этим паттерном функция вызывается для каждого английского слова в тексте. Callback-функция считает через глобальную переменную какое слово по счету, и если оно делится на два без остатка (т.е. четное) то возвращает текст, который преобразован к верхнему регистру. На то, что возвратила функция, меняется найденное совпадение в исходном тексте. Надеюсь, понятно объяснил Добавлено через 43 секунды А, да. В callback функцию передается массив, где значение с ключом 0 соответствует первая подмаска, с ключом 1 - вторая подмаска и т.д. Добавлено через 1 минуту и 19 секунд Вру, 0 - весь паттерн, 1 - первая подмаска, 2 - вторая подмаска и т.д. |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Да, объяснил хорошо) спасибо большое! И объясни пожалуйста насчет подмаски ... весь паттерн это в нашем случае все слово, а что тогда подмаска?) |
|||
|
||||
| enoff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 30.6.2010 Где: Санкт-Петербург Репутация: 11 Всего: 13 |
Весь паттерн, это то, что находится между ограничителями -> #вот здесь#.
Подмаска, это подпаттерн, ограниченный круглыми скобками -> #текст (\d+([a-z]+))текст(\s+)# Подмаски нумеруются слева направо по открывающей скобке. В первую подмаску войдут цифры и буквы английского алфавита. Во вторую подмаску буквы, в 3 - пробельные символы. Добавлено через 48 секунд Паттерн по теме подмасок не содержит |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
спасибо) все понятно) |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |