Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярные выражения 
:(
    Опции темы
4epT
Дата 7.9.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Добрый вечер! Скажите пожалуйста вот мне нужно написать регулярное выражение которое скажет - есть ли в строке хотя бы одно слово которое начинается с прописное русской буквы и заканчивается тоже прописной русской ...

Почему не работает вот такая запись?

Код

$str = "один из лучших языков программирования";
    if (preg_match ("/^[а-я]+[\S]*[а-я]$/", $str)) 
    {
        echo("Соответствие найдено");
    }
    else
    {
        echo("Соответствие не найдено");
    }


На сколько я понимаю это - слово начинается с прописной русской буквы (одна или более раз), затем следует любой символ кроме пробела, и заканчивается одним прописным символом русского алфавита ...

PM MAIL   Вверх
enoff
Дата 7.9.2010, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



вам нужно чтобы одно и то же слово начиналось и оканчивалось на прописные строчные, или разные слова?
^$ - соответствуют началу и концу строки.
[а-я]+ - 1 и больше строчных русских букв.
[\S]* - любое количество (в том числе и 0) непробельных символов.
[а-я] - одна строчная русская буква.

Паттерн совсем не соответствует условию.

Добавлено через 1 минуту и 20 секунд
Проблема в символах привязки к началу и концу строки. Так как строка содержит пробелы, а в паттерне указано, что не может.
вместо \S в данном случае лучше использовать \w - цифробуквенные символы, или вообще [а-я].
PM MAIL ICQ Skype GTalk   Вверх
4epT
Дата 7.9.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Я сделал по другому, разбил строку на слова ... и конретно к каждому слову применю вот такой шаблон:
Код

"/^[а-я]+[а-я]*[а-я]$/"


Все вроде хорошо, но вот такая строка - "- Ну-у-у… - озадачилась я, - Не помню уже.", не подходит ... хотя слово - "озадачилась" то что нам нужно.

Вот функция:
Код

        function isTrue($line)
    {
        $array = explode(" ", $line);
        for($i = 0; $i < count($array); $i++)
        {
            if ( preg_match ("/^[а-я]+[а-я]*[а-я]$/", $array[$i]) ) 
            {
                return true;
            }
        }
        
        return false;
    }


получает строку, разбивает на слова и проверяет каждое слово, если хоть одно слово встретилось то все ок .. иначе false

p.s. на сколько я понимаю прописные - это маленькие буквы) да?

PM MAIL   Вверх
enoff
Дата 7.9.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



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

if(preg_match("#\b[a-z]+\b#", $string)) echo true; else echo false;


Добавлено через 58 секунд
4epT, Прописные = ЗАГЛАВНЫЕ, строчные = маленькие.
PM MAIL ICQ Skype GTalk   Вверх
4epT
Дата 7.9.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Да, это решение намного красивее ...

А скажите пожалуйста возможно регулярным выражением перевести все четные слова состоящие из английских символов в верхний регистр ?
PM MAIL   Вверх
enoff
Дата 7.9.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



Код

<?php
$cnt_word = 0;
function replace($matches) {
    global $cnt_word;
    return ++$cnt_word % 2 == 0 ? strtoupper($matches[0]) : $matches[0];
    var_dump($matches);
    echo "<br>111<br>";
}
echo preg_replace_callback("#\b[a-z]+\b#i", "replace", "wer sadg sadg asdg");
?>

Менее красивее + ненавистный глобал smile 
PM MAIL ICQ Skype GTalk   Вверх
4epT
Дата 7.9.2010, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(enoff @ 7.9.2010,  21:55)
Код

<?php
$cnt_word = 0;
function replace($matches) {
    global $cnt_word;
    return ++$cnt_word % 2 == 0 ? strtoupper($matches[0]) : $matches[0];
    var_dump($matches);
    echo "<br>111<br>";
}
echo preg_replace_callback("#\b[a-z]+\b#i", "replace", "wer sadg sadg asdg");
?>

Менее красивее + ненавистный глобал smile

Можешь в кратце объяснить как оно работает?)

а именно вот это - "#\b[a-z]+\b#i", что тут значит #
PM MAIL   Вверх
enoff
Дата 7.9.2010, 22:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



4epT, # - ограничители паттерна. После ограничителей идут модификаторы.
У тебя используется "/". Мне привычнее решетки)
#\b[a-z]+\b#i - соответствует слову. preg_replace_callback вызывает для каждого найденного совпадения callback функцию.
Т.е. с этим паттерном функция вызывается для каждого английского слова в тексте.
Callback-функция считает через глобальную переменную какое слово по счету, и если оно делится на два без остатка (т.е. четное) то возвращает текст, который преобразован к верхнему регистру. На то, что возвратила функция, меняется найденное совпадение в исходном тексте.
Надеюсь, понятно объяснил smile

Добавлено через 43 секунды
А, да. В callback функцию передается массив, где значение с ключом 0 соответствует первая подмаска, с ключом 1 - вторая подмаска и т.д.

Добавлено через 1 минуту и 19 секунд
Вру, 0 - весь паттерн, 1 - первая подмаска, 2 - вторая подмаска и т.д.
PM MAIL ICQ Skype GTalk   Вверх
4epT
Дата 7.9.2010, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(enoff @ 7.9.2010,  22:32)
4epT, # - ограничители паттерна. После ограничителей идут модификаторы.
У тебя используется "/". Мне привычнее решетки)
#\b[a-z]+\b#i - соответствует слову. preg_replace_callback вызывает для каждого найденного совпадения callback функцию.
Т.е. с этим паттерном функция вызывается для каждого английского слова в тексте.
Callback-функция считает через глобальную переменную какое слово по счету, и если оно делится на два без остатка (т.е. четное) то возвращает текст, который преобразован к верхнему регистру. На то, что возвратила функция, меняется найденное совпадение в исходном тексте.
Надеюсь, понятно объяснил smile

Добавлено @ 22:33
А, да. В callback функцию передается массив, где значение с ключом 0 соответствует первая подмаска, с ключом 1 - вторая подмаска и т.д.

Добавлено @ 22:33
Вру, 0 - весь паттерн, 1 - первая подмаска, 2 - вторая подмаска и т.д.

Да, объяснил хорошо) спасибо большое!

И объясни пожалуйста насчет подмаски ... весь паттерн это в нашем случае все слово, а что тогда подмаска?) 
PM MAIL   Вверх
enoff
Дата 7.9.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 30.6.2010
Где: Санкт-Петербург

Репутация: 11
Всего: 13



Весь паттерн, это то, что находится между ограничителями -> #вот здесь#.
Подмаска, это подпаттерн, ограниченный круглыми скобками -> #текст (\d+([a-z]+))текст(\s+)#
Подмаски нумеруются слева направо по открывающей скобке.
В первую подмаску войдут цифры и буквы английского алфавита. Во вторую подмаску буквы, в 3 - пробельные символы.

Добавлено через 48 секунд
Паттерн по теме подмасок не содержит smile 
PM MAIL ICQ Skype GTalk   Вверх
4epT
Дата 7.9.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Цитата(enoff @ 7.9.2010,  22:42)
Весь паттерн, это то, что находится между ограничителями -> #вот здесь#.
Подмаска, это подпаттерн, ограниченный круглыми скобками -> #текст (\d+([a-z]+))текст(\s+)#
Подмаски нумеруются слева направо по открывающей скобке.
В первую подмаску войдут цифры и буквы английского алфавита. Во вторую подмаску буквы, в 3 - пробельные символы.

Добавлено @ 22:43
Паттерн по теме подмасок не содержит smile

спасибо) все понятно)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.