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

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

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

 

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

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

тема: Замена куска кода
 
 автор: angelcorpc   (18.05.2010 в 17:16)   письмо автору
 
 

Я с регулярными выражениями столкнулся не давно, тк возникла необходимость.
Есть текстовый файл, к котором присутствует такой кусок:

\c;
\s;extern void object::MowDown( )
\s;{
\s;    while ( true )
\s;    {
\s;        fire(1);
\s;        turn(10);
\s;    }
\s;}
\n;


как видно - это код программы. Необходимо все "\s;" удалить, а текст, который был ими выделен, весь целиком необходимо выделить тегом.
Как составлять регулярные выражения я уже более-менее понял. Но вот тут не могу понять как организовать возможность работы с этим текстом.
Т.е. должно получится что-то вроде вот этого:

<span>
extern void object::MowDown( )
{
    while ( true )
    {
        fire(1);
        turn(10);
    }
}
</span>

попробовал составить сам выражение, но получается только бред:
"/(?s:\\\\c;.)[.\n\r]?(\\\\s;.+\n)+(?:\\\\n;[.\n\r])/"

Понимаю что так много скобок это не хорошо, но пока не могу придумать более простого варианта...
Помогите пожалуйста.

P.S. вопрос еще есть, ответ на который не могу найти.
Везде пишется что для экранирования используется "\", но почему-то при попытки экранировать например "\с;" необходимо так много бекслешей. Пока не могу понять почему, помогите разобраться.

  Ответить  
 
 автор: big-trot   (18.05.2010 в 22:16)   письмо автору
 
   для: angelcorpc   (18.05.2010 в 17:16)
 


$text="\c;
\s;extern void object::MowDown( )
\s;{
\s;    while ( true )
\s;    {
\s;        fire(1);
\s;        turn(10);
\s;    }
\s;}
\n;";
echo preg_replace("#^(\\\s;)|(\\\c;)|(\\\n;)#imse", "('\\1')?(''):(('\\2')?('<span>'):(('\\3')?('</span>'):('')))", $text);

  Ответить  
 
 автор: angelcorpc   (18.05.2010 в 23:28)   письмо автору
 
   для: big-trot   (18.05.2010 в 22:16)
 

Вставляется только открывающий тег, а закрывающего нет.

  Ответить  
 
 автор: big-trot   (18.05.2010 в 23:58)   письмо автору
 
   для: angelcorpc   (18.05.2010 в 23:28)
 

У меня все работает. Можно внести единственную поправку.
^(?:(\\\s;)|(\\\c;)|(\\\n;))

но вряд ли она на что-то повлияет.

  Ответить  
 
 автор: imustang   (19.05.2010 в 02:12)   письмо автору
 
   для: angelcorpc   (18.05.2010 в 17:16)
 

а ты не пробовал воспользоваться обычными методами
str_replace

и конкатенацию строк ?

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

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