Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выделение подстроки из строки3.
 
 автор: dima2207   (06.01.2008 в 00:16)   письмо автору
 
 

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

   
 
 автор: SHAman   (06.01.2008 в 02:46)   письмо автору
 
   для: dima2207   (06.01.2008 в 00:16)
 

Если нужно найти слова, начинающиеся с заглавной буквы, то так:

/\b([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ].*?)\b/


Если требовалось не это, то четче формулируйте задачу. Если не можете, то давайте пример входных и выходных данных.

   
 
 автор: dima2207   (06.01.2008 в 03:26)   письмо автору
 
   для: SHAman   (06.01.2008 в 02:46)
 

Прошу прощения , я немного неправельно сформулировал задачу !
есть строка : ДрамаКомедияМузыкальный
нужно отделить все слова начинающиешиеся на заглавную букву .
$per[0]=Драма
$per[1]=Комедия
$per[3]=Музыкальный

   
 
 автор: SHAman   (06.01.2008 в 18:32)   письмо автору
 
   для: dima2207   (06.01.2008 в 03:26)
 

Тогда немного сложнее...

$big_russian = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";
/([$big_russian][^$big_russian]*?)/ 

   
 
 автор: Faraon   (06.01.2008 в 19:05)   письмо автору
 
   для: dima2207   (06.01.2008 в 03:26)
 


<pre>
<?php
$t
="ДрамаКомедияМузыкальный";
preg_match_all("#[А-Я]{1}[^А-Я]+#",$t,$out);
print_r($out);
?>

   
 
 автор: SHAman   (06.01.2008 в 21:19)   письмо автору
 
   для: Faraon   (06.01.2008 в 19:05)
 

1) зачем {1} после [А-Я]? Достаточно просто [А-Я][^А-Я]*
2) В классах символов с русскими диапазонами рекомендуется эти диапазоны прописывать полностью. Чтобы избежать проблем с разными кодировками, да и вообще. Надежней.
3) Я настаиваю на звездочке в конце класса-отрицания. А вдруг это слово из одной буквы?

   
 
 автор: Faraon   (07.01.2008 в 16:59)   письмо автору
 
   для: SHAman   (06.01.2008 в 21:19)
 

>1) зачем {1} после [А-Я]? Достаточно просто [А-Я][^А-Я]*
>2) В классах символов с русскими диапазонами рекомендуется эти диапазоны прописывать полностью. Чтобы избежать проблем с разными кодировками, да и вообще. Надежней.
>3) Я настаиваю на звездочке в конце класса-отрицания. А вдруг это слово из одной буквы?

1. Да в принципе не обязательно
2. Если кодировка предопределена то и короткий вариант нормально и не обязательно все буквы перебирать
3. Слово из одной буквы это предлог? По замыслу автора не думаю что в этой переменной есть предлоги, так как это строка судя повсему к предложению не имеет отношения.
А если уж так, то просто * без ?
Звездочка и так обозначает или ноль или более

   
 
 автор: SHAman   (07.01.2008 в 18:31)   письмо автору
 
   для: Faraon   (07.01.2008 в 16:59)
 

1. Конценсус достигнут :)
2. У меня глючило как-то подобное перечисление. Теперь не ленюсь перечислить ручками.
3. Если есть слова из одной буквы, то *, если нет, то +. Вопросика, действительно, не надо.

   
 
 автор: kasmanaft   (07.01.2008 в 19:29)   письмо автору
 
   для: SHAman   (07.01.2008 в 18:31)
 

>> Вопросика, действительно, не надо.
Только его не надо не потому что "звездочка и так обозначает или ноль или более", а потому что это рег. выражение будет работать и в жадном режиме. (UPD ЫЫ.. вернее, оно будет работать только в жадном режиме).

А насчет втрого, честно говоря, не очень верится.... Никогда не сталкивался, хз.
Однако
<? if (preg_match("/^[?-~]+$/""{|}"))
    echo 
"yes";

Выведет "yes". То есть из-за кириллицы оно не работать вроде как не может. И если перичислять все букавы руками, то перечислять надо и латиницу, и цифры... Что, по-моему, глупо.

Ну может какая хитрая кодировка есть? не знаю...

   
 
 автор: Unkind   (07.01.2008 в 21:05)   письмо автору
 
   для: kasmanaft   (07.01.2008 в 19:29)
 

Если нет модификатора "u" явно указывающего на то, что идет работа с UTF-8, то задаются диапазоны не символов, а байтов. Фактически для cp1251 задается промежуток 0xC0 - 0xDF (А - Я)

А если взять, например, KOI8-R, то там буквы расположены вообще в совершенно ином порядке: http://ru.wikipedia.org/wiki/KOI8-R
Тогда и правда придется прописывать все буквы.

> Однако
> <? if (preg_match("/^[?-~]+$/", "{|}"))
> echo "yes";
> Выведет "yes".

А что тут удивительного? Вы выбрали диапазон байтов, который будет соответствовать одной и той же последовательности символов в подавляющем большинстве кодировок. Лично я припоминаю только две кодировки в которых символы типа "?" выражаются по-другому. Это UCS-2 и UCS-4. Да и то там просто предваряется несколькими 0x00.

   
 
 автор: SHAman   (07.01.2008 в 21:42)   письмо автору
 
   для: Unkind   (07.01.2008 в 21:05)
 

Да, спецсимволы, цифры и латиница почти везде одинаковые места занимают. С кириллицей не все так гладко. Короче, дело вкуса.

   
 
 автор: kasmanaft   (08.01.2008 в 13:13)   письмо автору
 
   для: Unkind   (07.01.2008 в 21:05)
 

>> А что тут удивительного? Вы выбрали диапазон байтов, который будет соответствовать одной и той же последовательности символов в подавляющем большинстве кодировок.
Вопщем-то я и не удивлялся. Этим кодом я хотел показать, что "выбирается диапазон байтов" (не важно буквы это, цифры или что-то другое). А буквы, думаю, в большинстве кодировок тоже идут по порядку. А KOI8-R - это какое-то недоразумение :)

>> Faraon. В даном случае оно с ? и будет работать в жадном режиме.
По умолчанию рег. выражения работают в жадном режиме. "?" или модификатор "U" эту жадность инвертируют. В данном случае модификатора "U" нет, соответственно "с ?" будет работать в нежадном режиме. (отсюда и "в итоге получатся первые заглавные буквы" - потому что выражение нежадное)

PS о KOI8-R не знал... Вот и "хитрая кодировка".

   
 
 автор: Faraon   (08.01.2008 в 18:54)   письмо автору
 
   для: kasmanaft   (08.01.2008 в 13:13)
 

>По умолчанию рег. выражения работают в жадном режиме. "?" или модификатор "U" эту жадность инвертируют. В данном случае модификатора "U" нет, соответственно "с ?" будет работать в нежадном режиме. (отсюда и "в итоге получатся первые заглавные буквы" - потому что выражение нежадное)

to Kasmanaft
Я это прекрасно понимаю, и мне это объяснять не зачем :)

   
 
 автор: kasmanaft   (08.01.2008 в 18:58)   письмо автору
 
   для: Faraon   (08.01.2008 в 18:54)
 

Ну, может быть, неправильно понял... Мне так показалось, что Вы написали обратное.

   
 
 автор: Faraon   (07.01.2008 в 22:03)   письмо автору
 
   для: kasmanaft   (07.01.2008 в 19:29)
 

>Только его не надо не потому что "звездочка и так обозначает или ноль или более", а потому что это рег. выражение будет работать и в жадном режиме. (UPD ЫЫ.. вернее, оно будет работать только в жадном режиме).

>Ну может какая хитрая кодировка есть? не знаю...

В даном случае оно с ? и будет работать в жадном режиме.
В итоге и получатся первые заглавные буквы

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования