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

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

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

 

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

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

тема: перевести регулярное выражение на понятный язык
 
 автор: elenaki   (28.12.2005 в 21:38)   письмо автору
 
 

вот выражение:
preg_replace("/(?:file\:)?\w\:.*([^\/]+?\.(?:gif|jpg|png|bmp|tiff))/",'images\/',$field);

лезу в книгу. (фигу пока не вижу :))

/ - это признак так называемого Perl-совместимого регулярного выражения, т.е. если все выражение у меня заключено в прямые слэши - оно Perl-совместимое. я бы еще поставила i в конце, чтобы не зависеть от регистра, но это потом, когда заработает.

() - круглые скобки заключают в себе последовательность символов. у меня там ?:file\:
пойдем по порядку. ? - значит ноль или один символ. но перед знаком вопроса никаког символа нет, а дальше идет двоеточие. непонятно. двоеточие без обратного слэша, значит, у него какой-то особый смысл или это просто символ. но перед словом file не может стоять ни знака вопроса ни двоеточия, их мне искать не надо. зачем же они там стоят?

дальше идет обратный слэш, который экранирует двоеточие (это значит, что у двоеточия все-таки есть какое-то специальное назначение! но я его не нашла в книге), и после двоеточия круглая скобка закрывается, т.е. кончается последовательность. после нее стоит знак вопроса, указывающий на то, что эта последовательность может встретиться ноль или один раз.

далее следует загадочное выражение \w. оно тоже что-то значит, но что конкретно, в книге не объясняется, хотя в одном примере это выражение есть. нашла в другом месте:
\w символ слова, обычно [a-zA-Z0-9_] зачем мне тут символ слова? неужели не обойтись просто последовательностью в круглых скобках?

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

дальше опять отркываются круглые скобки, в которые заключена последовательность.
потом идет [^\/] - квадратные скобки означают класс символов, ^ - внутри квадратных скобок означает негатив, т.е. любой символ, кроме прямого слеша, который предусмотрительно экранирован обратным. за этой конструкцией стоит +, это значит - их может быть 1 и более.

потом опять идет знак вопроса, но без двоеточия. что же он все-таки означает?
потом точка с обратным слэшем (это значит - именно точка, а не любой символ).

потом еще одна последовательность, заключенная в круглые скобки. если бы не было впереди знака вопроса с двоеточием, было бы все понятно - выбор одного из предложенных значений gif, jpg, png, bmp, tif.

обращаюсь к знатокам. как сделать, чтобы это выражение заработало?
оно по идее должно выбирать из текста ссылки на файл типа G:\WWW\www\PHP\my-garden\img\1.jpg и менять их на \images\1.jpg, сохраняя ИМЯ ФАЙЛА. пути могут быть разными, имена файлов тоже. помогите! третий день страдаю...


нашла вот такой пример:


I'm using it for upload newsletter templates to server.

<?php

//Replace old path of images(gif || jpg || png) with $New_Path in $HTMLString

function Make_Replace_Image_Path($HTMLString$New_Path) {

   
$new_path "src=\"$New_Path\\3";
   
$pattern '/(src=(\'|").*\/(.*(\.jpg|\.gif|\.png)))/'
   
   
$Result_String preg_replace($pattern$new_path$HTMLString);    
       return(
$Result_String);

}
?>
Example:
<?php

$HTMLString 
'<img alt="" src="/somewhere/something.jpg">';
$New_Path 'http://www.kuru.cz/';

print 
Make_Replace_Image_Path($HTMLString$New_Path)

?>

will return

<img alt="" src="http://www.kuru.cz/something.jpg"> 


но он тоже работает не так, как мне надо. у него короткие пути к файлам меняются на полные. а мне надо наоборот.

   
 
 автор: Artem S.   (29.12.2005 в 00:04)   письмо автору
 
   для: elenaki   (28.12.2005 в 21:38)
 

Не правильную книгу вы читаете.
Итак:
(?:blabla) означает, что последовательность в скобках не нужно сохранять (по умолчанию все последовательности доступны по ссылкам $1 $2 и т.д.)
\w как вы правильно поняли, означает слово. Это сделано для того чтобы выражение было более читабельно, хотя можно пользоваться и так и так.
+? *? - знак вопроса инвертирует "жадность" квалификатора. Т.е. в выражении !aaa!ааа! - /!a+?/ будет сопоставлено с первым "а" а не с тремя.
А переписать это выражение можно так:
preg_replace("/(?:file\:)?\w\:.*([^\/]+?\.(?:gif|jpg|png|bmp|tiff))/",'images/$1',$field);

   
 
 автор: elenaki   (29.12.2005 в 00:16)   письмо автору
 
   для: Artem S.   (29.12.2005 в 00:04)
 

это уже больше на что-то похоже. но ОНО оставляет только один символ в имени файла! а имена могут быть разные... и не только из одной цифры...

(?:blabla) означает, что последовательность в скобках не нужно сохранять (по умолчанию все последовательности доступны по ссылкам $1 $2 и т.д.)

почему же мне не нужно сохранять эту последовательность? ведь вы потом ее же и подставляете - 'images/$1'.

кудв воткнуть \w? мне как раз нужно слово после последнего слэша и перед точкой.... это имя файла.

   
 
 автор: Artem S.   (29.12.2005 в 10:57)   письмо автору
 
   для: elenaki   (29.12.2005 в 00:16)
 

preg_replace("/(?:file\:)?\w\:.*([^\/]+?\.(?:gif|jpg|png|bmp|tiff))+/",'images/$1',$field);
Вот так попробуйте.
>> почему же мне не нужно сохранять эту последовательность?
Нет, $1 соответсвует другой скобке. Если бы (?:) не было, то далее надо было бы ставит $2.
>>кудв воткнуть \w?
Это слово состоящее из одной буквы, \w+ <- вот это уже "слово". Буква здесь - это просто имя диска (C:, D:, и.п.)

   
 
 автор: elenaki   (29.12.2005 в 12:01)   письмо автору
 
   для: Artem S.   (29.12.2005 в 10:57)
 

ничего не получается :(
вот таким выражением добилась, что сохраняет 2 символа от имени файла ( и расширение).

preg_replace("/(?:file\:)?\w\:.*([^\/]+\w+\.(?:gif|jpg|png|bmp|tiff))+/",'images/$1',$field);

все имя никак не выцепить...

   
 
 автор: elenaki   (01.01.2006 в 11:50)   письмо автору
 
   для: elenaki   (29.12.2005 в 12:01)
 

вопрос все еще висит в воздухе.
помогите кто-нибудь! плиииииз

   
 
 автор: cheops   (01.01.2006 в 13:26)   письмо автору
 
   для: elenaki   (01.01.2006 в 11:50)
 

Хм... а почему так сложно, ведь можно воспользоваться кодом
<?php
  $url 
'G:\WWW\www\PHP\my-garden\img\1.jpg';
  
$file basename($url);
  echo 
"\\image\\".$file;
?>

для замены адреса. Этот код можно поместить в функцию обратного вызова. Где необходимо заменить адрес в <img>, <a> или в произвольном месте?

   
 
 автор: elenaki   (01.01.2006 в 14:38)   письмо автору
 
   для: cheops   (01.01.2006 в 13:26)
 

это нужно для замены путей к картинкам при создании статей HTML-редакторе.
картинка вставляется вот таким кодом:

<input type="submit" value="OK" onclick="window.opener.EditField.execCommand('insertimage',false,document.forms['imgform'].img_file.value);">

понимаете, что в поле img_file стоит тот путь, который картинка имеет на компьютере автора статьи (который я конечно не знаю заранее). мне нужно этот путь заменить на реальный путь к картинке на сервере.

   
 
 автор: cheops   (01.01.2006 в 17:21)   письмо автору
 
   для: elenaki   (01.01.2006 в 14:38)
 

Не очень понятно, это необходимо осуществить средствами JavaScript или PHP?

   
 
 автор: elenaki   (01.01.2006 в 19:40)   письмо автору
 
   для: cheops   (01.01.2006 в 17:21)
 

неважно, какими средствами, главное - поменять.

   
 
 автор: Евгений Петров   (01.01.2006 в 22:01)   письмо автору
 
   для: elenaki   (01.01.2006 в 19:40)
 

Ну а чем вам тогда код cheops'a не нравится?

   
 
 автор: elenaki   (02.01.2006 в 09:56)   письмо автору
 
   для: Евгений Петров   (01.01.2006 в 22:01)
 

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

очень не хочется переходить на SPAW. он такой огромный, там ничего не найти. а этот
редактор, который я сейчас использую, лежит всего в одном файле, который я подключаю
инклудом. я там уже все поменяла, как мне нужно, и на греческий перевела. теперь по
новой начинать мучиться со SPAW' ом?

читала на woweb отзывы об этом редакторе. не только у меня такая проблема с картинками.
но решения там никто не предлагает...

   
 
 автор: cheops   (02.01.2006 в 13:18)   письмо автору
 
   для: elenaki   (02.01.2006 в 09:56)
 

А пути все заключены в двойные скобки? Тогда можно прибегнуть к функции обратного вызова
<?php 
  $pattern 
'|"[^"]+(\.jpg|\.gif|\.png)"|i'
  
$text preg_replace_callback
              
$pattern
              
"replace_text"
              
$HTMLString); 
  function 
replace_text($matches
  { 
    
// $matches[1] - это адрес 
    
return '"Новый_путь"'
  } 
?>


http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=10885

   
 
 автор: elenaki   (02.01.2006 в 23:29)   письмо автору
 
   для: cheops   (02.01.2006 в 13:18)
 

этот код не работает. выдает ошибку. почему вдруг слэши прямы стали? '|"[^"]+(\.jpg|\.gif|\.png)"|i'

   
 
 автор: cheops   (03.01.2006 в 03:12)   письмо автору
 
   для: elenaki   (02.01.2006 в 23:29)
 

Ой, извиняюсь, попробуйте
<?php
  $pattern 
'#"[^"]+(\.jpg|\.gif|\.png)"#i';
?>

PS Символы ограничители могут быть любыми и я для красоты часто использую |, где этот символ не используется в самом выражении - вот за это и поплатился :)))

   
 
 автор: elenaki   (03.01.2006 в 12:06)   письмо автору
 
   для: cheops   (03.01.2006 в 03:12)
 

это выражение выводит по буквам. каждое $matches[$i] - это буква. но я же не знаю, сколько
у меня букв в имени файла! мне нужно отрезать с конца строки и до первого слэша. почему
никто не ищет с конца, ведь это же проще?

   
 
 автор: cheops   (03.01.2006 в 13:04)   письмо автору
 
   для: elenaki   (03.01.2006 в 12:06)
 

Есть такое дело... Можно воспользоваться таким скриптом
<?php 
  $HTMLString 
'<img alt="" src="/somewhere/something.jpg">';
  
$pattern '#"[^"]+(\.jpg|\.gif|\.png)"#i';
  
$text preg_replace_callback
              
$pattern
              
"replace_text"
              
$HTMLString); 
  function 
replace_text($matches
  { 
    
// $matches[0] - это адрес 
    
echo $matches[0];
    return 
'"Новый_путь"'
  } 
?>

В этом случае $matches[0] будет содержать "/somewhere/something.jpg", который можно преобразовать и вернуть вместо '"Новый_путь"', или это тоже не то?

   
 
 автор: cheops   (01.01.2006 в 13:26)   письмо автору
 
   для: elenaki   (01.01.2006 в 11:50)
 

.

   
Rambler's Top100
вверх

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