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

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

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

 

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

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

тема: сделать trim в регулярку
 
 автор: psychomc   (16.04.2010 в 16:24)   письмо автору
 
 

добрй день.

<?php
// в общем есть текст
$text "start любой текст end start опять текст end";
// и есть регулярка которая вырезает и изменяет текст между start и end
$text preg_replace("#start\s*([^end]+)\s*end#i""$1"$text); 
echo 
$text;
?>


как я могу её изменить, чтобы она не забирала, либо обрезала пробелы, но только по краям, у текста, который попадёт либо уже попал в $1? нужно это сделать именно в этом выражении...

и еще вопрос номер 2: чем отличаются выражения "#....#" и "#i....#" ?

спасибо

  Ответить  
 
 автор: baston   (16.04.2010 в 16:31)   письмо автору
 
   для: psychomc   (16.04.2010 в 16:24)
 

1) trim()
2) модификтор i определяет независимость от регистра. И ставится он в конце выражения, а не в начале.

  Ответить  
 
 автор: psychomc   (16.04.2010 в 16:48)   письмо автору
 
   для: baston   (16.04.2010 в 16:31)
 

упс, извиняюсь, он туда случайно попал! я имел ввиду сами символы / / и # #

покажите плиз каким образом trim вставить можно

  Ответить  
 
 автор: baston   (16.04.2010 в 16:51)   письмо автору
 
   для: psychomc   (16.04.2010 в 16:48)
 

trim($text)
Или вы хотели, чтобы исключение пробелов было заложено в самом шаблоне?

Указанные вами символы могут служить символами-ограничителями регулярного выражения.

  Ответить  
 
 автор: psychomc   (16.04.2010 в 17:00)   письмо автору
 
   для: baston   (16.04.2010 в 16:51)
 

>Или вы хотели, чтобы исключение пробелов было заложено в самом шаблоне?
да, я видимо немного неправильно изложил суть изначально. в самом шаблоне нужно для каждого фрагмента.

то есть символы выполняют одну и ту же функцию?

  Ответить  
 
 автор: baston   (16.04.2010 в 17:30)   письмо автору
 
   для: psychomc   (16.04.2010 в 17:00)
 

Попробуйте такой вариант
$text = "start любой текст end start опять текст end";
// и есть регулярка которая вырезает и изменяет текст между start и end
$text = preg_replace("#(start\s)([^end]*)(\send)#i", "$2", $text); 
echo "<pre>";
print_r($text);
echo "</pre>"; 


Ограничители регулярного выражения могут быть любыми, главное чтобы они не были задействованы в самом шаблоне.

  Ответить  
 
 автор: psychomc   (16.04.2010 в 17:45)   письмо автору
 
   для: baston   (16.04.2010 в 17:30)
 

спасибо большое, работает
я его только чуть-чуть подправил
$text = preg_replace("#(start\s*)([^end]*)(\s*end)#i", "$2", $text);
чтобы обрезал все

  Ответить  
 
 автор: neadekvat   (16.04.2010 в 17:43)   письмо автору
 
   для: psychomc   (16.04.2010 в 16:24)
 

кагбэ по сути существует модификатор e, который после подстановки исполняет получившуюся строку как php-код. Но то ли лыжи не катят, то ли..
Так что я пользуюсь preg_replace_callback:
<?php
$text 
preg_replace_callback("/start\s*([^end]+)\s*end/i",
create_function(
 
'$matches',
'return trim($matches[1]);'
),
$text);  

Ну, или можно функцию отдельно создать и к ней обратить, а не create_function использовать..

  Ответить  
 
 автор: psychomc   (16.04.2010 в 17:47)   письмо автору
 
   для: neadekvat   (16.04.2010 в 17:43)
 

спасибо, интересный подход.

буду дальше курить эти regexp-ы....

  Ответить  
 
 автор: Trianon   (16.04.2010 в 19:28)   письмо автору
 
   для: neadekvat   (16.04.2010 в 17:43)
 

для применения модификатора e нужно иметь очень продвинутые лыжи.
Я оленьим жиром, помнится, мазал... долго и старательно.

  Ответить  
 
 автор: neadekvat   (16.04.2010 в 19:44)   письмо автору
 
   для: Trianon   (16.04.2010 в 19:28)
 

И как, поехали?

  Ответить  
 
 автор: Trianon   (16.04.2010 в 19:54)   письмо автору
 
   для: neadekvat   (16.04.2010 в 19:44)
 

Отож
Наивысшая веселость там заключается в том, что тело литерала оторвано от его "кавычного" обрамления.
Ну и еще в том, что областью видимости является функция, из которой выполнен вызов preg_replace.
Что иногда неслабо так спасает.

  Ответить  
 
 автор: neadekvat   (16.04.2010 в 20:04)   письмо автору
 
   для: Trianon   (16.04.2010 в 19:54)
 

Я тут подумал - а ведь ничего из ваших слов не понял

  Ответить  
 
 автор: Trianon   (16.04.2010 в 20:11)   письмо автору
 
   для: neadekvat   (16.04.2010 в 20:04)
 

Вы попробуйте preg_replace/e на примерах из мануала, постепенно усложняя задачу.
Оно поддастся наверняка. Потом усложните задачу. Еще усложните. Всё будет.
Потом попробуйте инъекцию учинить. :)

  Ответить  
 
 автор: neadekvat   (16.04.2010 в 21:38)   письмо автору
 
   для: Trianon   (16.04.2010 в 20:11)
 

Все гениальное - просто. Спасибо =)

  Ответить  
 
 автор: big-trot   (16.04.2010 в 22:26)   письмо автору
 
   для: neadekvat   (16.04.2010 в 21:38)
 

Интересно, а такую строку ваше выражение найдет?

"start любой e текст end start опять e текст end"

  Ответить  
 
 автор: neadekvat   (16.04.2010 в 23:06)   письмо автору
 
   для: big-trot   (16.04.2010 в 22:26)
 

Моих рег.выражений тут нет.

  Ответить  
 
 автор: baston   (17.04.2010 в 08:40)   письмо автору
 
   для: big-trot   (16.04.2010 в 22:26)
 

верно, не найдет. Значит, автору вопроса надо еще подумать над выражением или же воспользоваться стандартными функциями PHP.

  Ответить  
 
 автор: baston   (17.04.2010 в 10:56)   письмо автору
 
   для: baston   (17.04.2010 в 08:40)
 

Например, так:
<?php
$text 
"start любой у текст е end. start опять 1, текст entropy end";
$result = array();    //массив с результатами
//Вспомогательные переменные
$start 0;
$pos2 1;
//Начинаем цикл
while($pos2)    //пока истинно лог.выражение
{
  
//Начало искомого текста
  
$pos1 mb_strpos($text"start"$start);
  
//Конец искомого текста
  
$pos2 =  mb_strpos($text"end"$pos1);
  
//Задаем условия, при которых продолжаем вытаскивать искомый текст
    
if(($pos1 && $pos2 && $start 0) ||
          (
$pos1 >= && $pos2 && $start == 0))
  {
    
//Заносим найденный текст в массив
    
$result[] = trim(mb_substr($text$pos1 5$pos2 $pos1 5));
    
$start =  $pos2 3;
  }
  else
  {
      
//Выходим из цикла
      
break;
  }
}
echo 
"<pre>";
print_r($result);
echo 
"</pre>";

  Ответить  
 
 автор: big-trot   (17.04.2010 в 18:17)   письмо автору
 
   для: baston   (17.04.2010 в 10:56)
 


// в общем есть текст
$text = "start любой текст end start опять текст end";
// и есть регулярка которая вырезает и изменяет текст между start и end
$text = preg_replace("#start((?:(?!end).)*)end#ie", "trim('$1')", $text);

  Ответить  
 
 автор: psychomc   (18.04.2010 в 10:22)   письмо автору
 
   для: big-trot   (17.04.2010 в 18:17)
 

тема живёт :)

ваш вариант работает, но есть один момент: как мне в replacement.перед и после функции trim добавить еще произвольный текст?
что-то типа
<?php
$text 
preg_replace("#start((?:(?!end).)*)end#ie""какойто-текст trim('$1') и еще текст"$text);


пробовал извращаться по-разному с кавычками, но что-то как-то не удавось. спасибо

p.s я понимаю что там eval, но все-таки может есть какие-нибудь варианты...

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

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