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

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

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

 

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

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

тема: Ошибка в рег. выр. (Замена локального пути к файлу на другой)
 
 автор: XOR   (25.03.2006 в 13:56)   письмо автору
 
 

Такая беда:
Есть такая строка кода:
<?
$field 
preg_replace("/(?:file\:)?\w\:.*([^\/]\.(?:gif|jpg|png|bmp|tiff))/im",'./files/pix/\1',$field);
?>
Суть замены состоит в том, чтобы найти в html коде локальный путь к файлу (Например "C:\Documents and Settings\User\Мои документы\Мои рисунки\file.gif"), и заменить его на "./files/pix/filename.ext" Находить - то она находит. А, вот заменяет не совсем удачно. От имени файла остается только последний символ+расширение (Из того же примера, получается "./files/pix/e.gif"). Че тут нужно подправить, чтобы имя файла без обрезаний было?
Заранее спасибо.

   
 
 автор: kasmanaft   (25.03.2006 в 21:04)   письмо автору
 
   для: XOR   (25.03.2006 в 13:56)
 

наверно нужно после [^\/] поставить здездочку
<? 
$field 
preg_replace("/(?:file\:)?\w\:.*([^\/]*\.(?:gif|jpg|png|bmp|tiff))/im",'./files/pix/\1',$field); 
?>

   
 
 автор: XOR   (26.03.2006 в 04:06)   письмо автору
 
   для: kasmanaft   (25.03.2006 в 21:04)
 

К сожалению, с этой звездочкой он вообще только расширение файла оставляет. :(
Может у кого есть готовое выражение для замены строки вида

"C:\Documents and Settings\User\Мои документы\Мои рисунки\TEMP\file.ext" 
на

"./patch/file.ext"
А? Поможите?

   
 
 автор: XOR   (26.03.2006 в 08:38)   письмо автору
 
   для: kasmanaft   (25.03.2006 в 21:04)
 

Порылся на форуме.
Судя по всему, я не первый у кого возникла затыка с визуальным редактором : )
Изучив проблему более детально, я пришел к выводу, что проблемы, на самом деле, две : ))))
Первая проблема - это преобразование строки, вида:
"C:\Documents and Settings\User\Мои документы\Мои рисунки\TEMP\file.ext"
на строку вида "./patch/file.ext"
А вторая проблема - это преобразование строки вида:
"file:///C:/Documents and Settings/User\Мои документы/Мои рисунки/TEMP/file.ext" в строку "./patch/file.ext".
Такой гемор связан с тем, что визуальный редактор, который мы тут пытаемся приспособить, формирует путь к файлу двумя различными способами. Если вставлять файл через диалоговое окно с формой, то путь выглядит, как "C:\Documents and Settings\User\Мои документы\Мои рисунки\TEMP\file.ext". Если же его вставлять через Ctrl+V (Shift+Ins), то путь прописывется в виде "file:///C:/Documents and Settings/User\Мои документы/Мои рисунки/TEMP/file.ext". Вот и выходит, что учитывать и обробатывать нужно оба варианта.
У кого какие соображения?

   
 
 автор: cheops   (26.03.2006 в 14:45)   письмо автору
 
   для: XOR   (26.03.2006 в 08:38)
 

>"C:\Documents and Settings\User\Мои документы\Мои рисунки\TEMP\file.ext"
>"file:///C:/Documents and Settings/User\Мои документы/Мои рисунки/TEMP/file.ext"
Это как раз большой проблемы не представляет
<?php
  $text 
'C:\Documents and Settings\User\Мои документы\Мои рисунки\TEMP\file.ext';
  
$text 'file:///C:/Documents and Settings/User\Мои документы/Мои рисунки/TEMP/file.ext';
  
preg_match("|[^/\\\\]+$|",$text,$out);
  echo 
"./patch/".$out[0];
?>

   
 
 автор: XOR   (27.03.2006 в 03:09)   письмо автору
 
   для: cheops   (26.03.2006 в 14:45)
 

А..... Эмммммм.... Видимо я не совсем праильно объяснил. Эти строки содержаться внутри HTML файла, причем их там может быть много, и встречаться обе разновидности.
Все это нужно вот для чего:
Есть такой визуальный HTML редактор, который выполнен в виде WEB приложения. И он умеет создавать HTML кстраницы с картинками, а потом делать им UPLOAD. Проблема возникает именно на этапе аплоада. Дело в том, что он формирует HTML файл, в котором все пути к картинкам прописаны локальные. Причем, как я уже говорил ранее, эти пути получаются двух видов - в зависимости от того, как эту картинку туда вставили. Вот, задача в том и состоит, чтобы найти в HTML коде все пути к картинкам и заменить на те, которые должны быть на самом деле. Для наглядности, приведу родной код, который ведет себя некорректно.:
Файл save.php

<?
#######################################
#                                     #
#         ArthEdit версия 0.12        #
#                                     #
#######################################

$field stripslashes($field);     // Ну, тут все и так понятно....
$field preg_replace("/(?:file\:)?\w\:.*([^\/]+?\.(?:gif|jpg|png|bmp|tiff))/im",'./files/pix/\1',$field);
// А вот эта строка как раз и должна делать то, чего она не делает. Кроме того, она 
// изначально заточена под обработку только одной разновидности локального пути

// Ну, а здесь мы сохраняем все это в файл.
$fp fopen("./files/$filename",'w');   
fputs($fp,$field);
fclose($fp);
?>

   
 
 автор: cheops   (27.03.2006 в 13:55)   письмо автору
 
   для: XOR   (27.03.2006 в 03:09)
 

А данные пути встречаются только в тэгах <a> и <img> или ещё где-то?

   
 
 автор: XOR   (28.03.2006 в 02:55)   письмо автору
 
   для: cheops   (27.03.2006 в 13:55)
 

По идеи только в этих тэгах... Я еще подумаю, но скорее всего только в них. Это же редактор... Код не рукописный....

   
 
 автор: cheops   (28.03.2006 в 14:16)   письмо автору
 
   для: XOR   (28.03.2006 в 02:55)
 

Предположим, что у вас путь в атрибутах href и src всегда заключены в кавычки, тогда можно воспользоваться следующим скриптом
<?php 
  $str 
'<a href="C:\Documents and Settings\User\Мои документы\Мои рисунки\TEMP\file.ext"> <img src="file:///C:/Documents and Settings/User\Мои документы/Мои рисунки/TEMP/file.ext"> </a>'

  
$pattern "|href=\"([^\"]+)\"|is";
  
$str preg_replace_callback
              
$pattern
              
"plus_href"
              
$str); 
  
$pattern "|src=\"([^\"]+)\"|is";
  
$str preg_replace_callback
              
$pattern
              
"plus_src"
              
$str); 
  echo 
$str;
  
  
// функция обратного вызова 
  
function plus_href($matches
  { 
    
// В $matches[1] у нас путь - его нужно заменить
    // на имя файла - извлекаем его
    
preg_match("|[^/\\\\]+$|",$matches[1],$out);
   
    return 
'href="'.$out[0].'"'
  }
  
// функция обратного вызова 
  
function plus_src($matches
  { 
    
// В $matches[1] у нас путь - его нужно заменить
    // на имя файла - извлекаем его
    
preg_match("|[^/\\\\]+$|",$matches[1],$out);
   
    return 
'src="'.$out[0].'"'
  }
?>

   
 
 автор: Trianon   (28.03.2006 в 10:24)   письмо автору
 
   для: XOR   (27.03.2006 в 03:09)
 

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

   
 
 автор: XOR   (29.03.2006 в 02:57)   письмо автору
 
   для: Trianon   (28.03.2006 в 10:24)
 

cheops, спасибо! Я попробую. Напишу - что получилось
Trianon я уверен в том, что, по крайней мере этот редактор - не умееет. Да и как его научить, если вставка рисунка осуществляется, по сути, через стандартный input. А он, как понимаете, относительные пути не пропысывает. Хотя, разумеется, никто не запрещает править код в ручную. Но в таком случае, этот редактор вообще не нужен. Одного фронпейджа достаточно. Моя задача - максимально автоматизировать наполнение контента.
Всем спасибо, кто помогал. Попробую че - нить сделать. О результатах напишу.

   
 
 автор: XOR   (29.03.2006 в 04:42)   письмо автору
 
   для: XOR   (29.03.2006 в 02:57)
 

Ура! Все работает! Спасибо всем, кто помогал, особенно cheops

   
Rambler's Top100
вверх

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