| |
|
|
| | вот выражение:
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">
|
но он тоже работает не так, как мне надо. у него короткие пути к файлам меняются на полные. а мне надо наоборот. | |
| |
|
|
| |
|
|
| |
для: elenaki
(28.12.2005 в 21:38)
| | | Не правильную книгу вы читаете.
Итак:
(?:blabla) означает, что последовательность в скобках не нужно сохранять (по умолчанию все последовательности доступны по ссылкам $1 $2 и т.д.)
\w как вы правильно поняли, означает слово. Это сделано для того чтобы выражение было более читабельно, хотя можно пользоваться и так и так.
+? *? - знак вопроса инвертирует "жадность" квалификатора. Т.е. в выражении !aaa!ааа! - /!a+?/ будет сопоставлено с первым "а" а не с тремя.
А переписать это выражение можно так:
preg_replace("/(?:file\:)?\w\:.*([^\/]+?\.(?:gif|jpg|png|bmp|tiff))/",'images/$1',$field); | |
| |
|
|
| |
|
|
| |
для: Artem S.
(29.12.2005 в 00:04)
| | | это уже больше на что-то похоже. но ОНО оставляет только один символ в имени файла! а имена могут быть разные... и не только из одной цифры...
(?:blabla) означает, что последовательность в скобках не нужно сохранять (по умолчанию все последовательности доступны по ссылкам $1 $2 и т.д.)
почему же мне не нужно сохранять эту последовательность? ведь вы потом ее же и подставляете - 'images/$1'.
кудв воткнуть \w? мне как раз нужно слово после последнего слэша и перед точкой.... это имя файла. | |
| |
|
|
| |
|
|
| |
для: elenaki
(29.12.2005 в 00:16)
| | | preg_replace("/(?:file\:)?\w\:.*([^\/]+?\.(?:gif|jpg|png|bmp|tiff))+/",'images/$1',$field);
Вот так попробуйте.
>> почему же мне не нужно сохранять эту последовательность?
Нет, $1 соответсвует другой скобке. Если бы (?:) не было, то далее надо было бы ставит $2.
>>кудв воткнуть \w?
Это слово состоящее из одной буквы, \w+ <- вот это уже "слово". Буква здесь - это просто имя диска (C:, D:, и.п.) | |
| |
|
|
| |
|
|
| |
для: Artem S.
(29.12.2005 в 10:57)
| | | ничего не получается :(
вот таким выражением добилась, что сохраняет 2 символа от имени файла ( и расширение).
preg_replace("/(?:file\:)?\w\:.*([^\/]+\w+\.(?:gif|jpg|png|bmp|tiff))+/",'images/$1',$field);
все имя никак не выцепить... | |
| |
|
|
| |
|
|
| |
для: elenaki
(29.12.2005 в 12:01)
| | | вопрос все еще висит в воздухе.
помогите кто-нибудь! плиииииз | |
| |
|
|
| |
|
|
| |
для: 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> или в произвольном месте? | |
| |
|
|
| |
|
|
| |
для: 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 стоит тот путь, который картинка имеет на компьютере автора статьи (который я конечно не знаю заранее). мне нужно этот путь заменить на реальный путь к картинке на сервере. | |
| |
|
|
| |
|
|
| |
для: elenaki
(01.01.2006 в 14:38)
| | | Не очень понятно, это необходимо осуществить средствами JavaScript или PHP? | |
| |
|
|
| |
|
|
| |
для: cheops
(01.01.2006 в 17:21)
| | | неважно, какими средствами, главное - поменять. | |
| |
|
|
| |
|
|
| |
для: elenaki
(01.01.2006 в 19:40)
| | | Ну а чем вам тогда код cheops'a не нравится? | |
| |
|
|
| |
|
|
| |
для: Евгений Петров
(01.01.2006 в 22:01)
| | | у меня не просто переменная, в которой путь. у меня текст, в середине которого могут
встретиться ссылки на картинки (картинки уже загружены ранее другим скриптом), поэтому
надо сначала эти ссылки отыскать, потом изменить, потом запомнить весь текст в базе...
очень не хочется переходить на SPAW. он такой огромный, там ничего не найти. а этот
редактор, который я сейчас использую, лежит всего в одном файле, который я подключаю
инклудом. я там уже все поменяла, как мне нужно, и на греческий перевела. теперь по
новой начинать мучиться со SPAW' ом?
читала на woweb отзывы об этом редакторе. не только у меня такая проблема с картинками.
но решения там никто не предлагает... | |
| |
|
|
| |
|
|
| |
для: 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 | |
| |
|
|
| |
|
|
| |
для: cheops
(02.01.2006 в 13:18)
| | | этот код не работает. выдает ошибку. почему вдруг слэши прямы стали? '|"[^"]+(\.jpg|\.gif|\.png)"|i' | |
| |
|
|
| |
|
|
| |
для: elenaki
(02.01.2006 в 23:29)
| | | Ой, извиняюсь, попробуйте
<?php
$pattern = '#"[^"]+(\.jpg|\.gif|\.png)"#i';
?>
|
PS Символы ограничители могут быть любыми и я для красоты часто использую |, где этот символ не используется в самом выражении - вот за это и поплатился :))) | |
| |
|
|
| |
|
|
| |
для: cheops
(03.01.2006 в 03:12)
| | | это выражение выводит по буквам. каждое $matches[$i] - это буква. но я же не знаю, сколько
у меня букв в имени файла! мне нужно отрезать с конца строки и до первого слэша. почему
никто не ищет с конца, ведь это же проще? | |
| |
|
|
| |
|
|
| |
для: 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", который можно преобразовать и вернуть вместо '"Новый_путь"', или это тоже не то? | |
| |
|
|
| |
|
|
| |
для: elenaki
(01.01.2006 в 11:50)
| | | . | |
| |
|
|