Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

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

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

 

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

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

тема: Извлечь текст
 
 автор: Лена   (02.10.2008 в 16:12)   письмо автору
 
 

Помогите разобраться. Мне нужно извлечь текст, что написан русскими буквами(он может быть и английскими буквами написан), то есть из всего выбрать только название.
Я так делаю:

<?php
$one 
"1|./index/Устройство полов.txt
1|./index/Проект и дизайн интерьера.txt
1|./index/Плиточные работы.txt
1|./index/Как узнать стоимость ремонта.txt
1|./index/Декоративно-отделочные работы.txt"
;
print 
preg_replace('#(?<=\d{1,4}|.\/index\/)([A-Za-zА-Яа-я\s-_]*)(?=\.txt\\n)#is','$2'$one);
?>

  Ответить  
 
 автор: AcidTrash   (02.10.2008 в 16:45)   письмо автору
 
   для: Лена   (02.10.2008 в 16:12)
 

>Мне нужно извлечь текст
<pre>
<?php
$one 
"1|./index/Устройство полов.txt
1|./index/Проект и дизайн интерьера.txt
1|./index/Плиточные работы.txt
1|./index/Как узнать стоимость ремонта.txt
1|./index/Декоративно-отделочные работы.txt"
;
preg_match_all("#\d+\|\./index/(.+?).txt#i",$one,$out);
unset(
$out[0]);
print_r($out);
?>


Заменить
print preg_replace("#\d+\|\./index/(.+?).txt#i","$1",$one);   

  Ответить  
 
 автор: Лена   (02.10.2008 в 17:06)   письмо автору
 
   для: AcidTrash   (02.10.2008 в 16:45)
 

1. Вот это не пойму: (.+?) - один любой символ должен встречаться один или несколько раз, а тогда "?" здесь зачем?
2. Зачем разрушать полученный массив unset($out[0]); и обязательно ли это делать?

  Ответить  
 
 автор: Keda   (02.10.2008 в 17:23)   письмо автору
 
   для: Лена   (02.10.2008 в 17:06)
 

1. Это не жадное выражение, которое дает самое короткое совпадение. В этом примере наверно будет лишним, но часто бывает полезным.
Попробуйте убрать из переменной $one все переносы строки так, чтобы вышла одна длинная строка и посмотрите результат в обоих случаях.
2. Уничтожение переменной высвобождает память. Бывает полезным для объемных скриптов.

  Ответить  
 
 автор: AcidTrash   (02.10.2008 в 17:27)   письмо автору
 
   для: Keda   (02.10.2008 в 17:23)
 

1.
>чтобы вышла одна длинная строка
Вот поэтому он и не лишний.
Хотя дело можно было поправить модификатором U.

2. В этом вы правы.
Но в этом примере , я удалил ненужное для наглядности :)

  Ответить  
 
 автор: Keda   (02.10.2008 в 17:43)   письмо автору
 
   для: AcidTrash   (02.10.2008 в 17:27)
 

>Вот поэтому он и не лишний.
Точке не соответствует символ перевода строки, если не указан модификатор s.

  Ответить  
 
 автор: AcidTrash   (02.10.2008 в 17:53)   письмо автору
 
   для: Keda   (02.10.2008 в 17:43)
 

>Точке не соответствует символ перевода строки, если не указан модификатор s.
Здесь дело не в этом. Метасимвол ? меняет жадность регулярного выражения.

  Ответить  
 
 автор: Лена   (02.10.2008 в 17:59)   письмо автору
 
   для: AcidTrash   (02.10.2008 в 17:53)
 

Там, где стоит ?, переводы строк внутри массива сохраняются.
Еще вот что интересно.
Если я потом начинаю выводить каждый элемент полученного массива - foreach ($out[1] as $a) print $a;
то там, где я ставлю ?, все нормально, а вот где ? нет и я убираю внутри строки переводы
строк, строка не заменяется. Фантастика!


<?php
$one 
"1|./index/Устройство полов.txt 1|./index/Проект и дизайн интерьера.txt 

1|./index/Плиточные работы.txt 1|./index/Как узнать стоимость ремонта.txt 

1|./index/Декоративно-отделочные работы.txt"

preg_match_all("#\d+\|\./index/(.+).txt#i",$one,$out); 
unset(
$out[0]);
//print_r($out);
foreach ($out[1] as $a) print $a;
?>

  Ответить  
 
 автор: AcidTrash   (02.10.2008 в 22:05)   письмо автору
 
   для: Лена   (02.10.2008 в 17:59)
 

>а вот где ? нет и я убираю внутри строки переводы
>строк
Не особо понятно. В приведенном вами примере поставьте модификатор U.

  Ответить  
 
 автор: Лена   (03.10.2008 в 10:03)   письмо автору
 
   для: AcidTrash   (02.10.2008 в 22:05)
 

Чтобы было понятно. Код:

<?php 
$one 
"1|./index/Устройство полов.txt 1|./index/Проект и дизайн интерьера.txt  1|./index/Плиточные работы.txt 1|./index/Как узнать стоимость ремонта.txt  1|./index/Декоративно-отделочные работы.txt";  
preg_match_all("#\d+\|\./index/(.+?).txt#i",$one,$out);  
unset(
$out[0]); 
//print_r($out); 
foreach ($out[1] as $a) print $a
?>


Результат этого кода:

Устройство половПроект и дизайн интерьераПлиточные работыКак узнать стоимость ремонтаДекоративно-отделочные работы


Код:

<?php
$one 
"1|./index/Устройство полов.txt 1|./index/Проект и дизайн интерьера.txt 1|./index/Плиточные работы.txt 1|./index/Как узнать стоимость ремонта.txt 1|./index/Декоративно-отделочные работы.txt"
preg_match_all("#\d+\|\./index/(.+).txt#i",$one,$out); 
unset(
$out[0]); 
foreach (
$out[1] as $a) print $a;
//print_r($out);
?>


Результат:

Устройство полов.txt 1|./index/Проект и дизайн интерьера.txt 1|./index/Плиточные работы.txt 1|./index/Как узнать стоимость ремонта.txt 1|./index/Декоративно-отделочные работы 


Во втором случае строка не меняется. Вот что я хотела сказать

  Ответить  
 
 автор: Keda   (03.10.2008 в 11:03)   письмо автору
 
   для: Лена   (03.10.2008 в 10:03)
 

В действительности она меняется. Вначале строки нет "1|./index/", а в конце ".txt". Все из-за жадности выражения. Без символа ? берется максимальная строка.

  Ответить  
Rambler's Top100
вверх

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