Jump to content
  • 0

Регулярные выражения


medyson
 Share

Question

Собственно вопрос.

есть некоторое поле $value->description , в котором находится html код. из него нужно вытащить название всех файлов, являющимися изображениями.

выполняю следующую команду:


preg_match_all("#img src=(?:\"|')(.*)(?:\"|')#isU", $value->description, $image);

таким образом в $image[1] помещаются все пути к изображениям.

они могут иметь совершенно разный вид.

например:

/images/img.jpg

или:

http://www.site.ru/images/1/img2.gif

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

Link to comment
Share on other sites

Recommended Posts

  • 0

как вариант воспользуйтесь explode();

типа того:


<?php
$f = 'http://www.site.ru/images/1/img2.gif';
$t = '/images/img.jpg';
$r = explode('/', $f);
echo end($r).'<br>';
$h = explode('/', $t);
echo end($h);
?>

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

Link to comment
Share on other sites

  • 0

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

medyson, никого не слушайте. pathinfo() же! :facepalmxd:

ЗЫ: минусуй модераторов :D

Edited by Быколай
Link to comment
Share on other sites

  • 0

medyson, никого не слушайте. pathinfo() же! :facepalmxd:

да, твой вариант емче и лучше, но рассматривать нужно все варианты, хотя бы для самообразования и общего представления ;)

ЗЫ: минусуй модераторов :D

без пробелем ;)

Edited by rus
Link to comment
Share on other sites

  • 0

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

medyson, никого не слушайте. pathinfo() же! :facepalmxd:

ЗЫ: минусуй модераторов :D

Спасибо. Дельный совет. все работает!)

Link to comment
Share on other sites

  • 0

и еще один вопрос по тем же регуляркам. в $image[1] у меня заносятся только те ссылки на изображения, которые имеют вид <img src=...> , а если между ними есть какие-либо параметры то уже никак. не подскажете как поменять регулярное выражение, чтоб ссылки всех изображение попадали в данный массив

Link to comment
Share on other sites

  • 0

#img\s+.*?src=("|')(?:(?:.*?/)?([^/]+?))\1#

Попробуйте так и посмотрите что в $image[2] будет. Вроде должно решить обе ваши проблемы. Если нет - напишите что там выводит. Просто проверять лень :huh:

Edited by MiksIr
Link to comment
Share on other sites

  • 0

и еще один вопрос по тем же регуляркам. в $image[1] у меня заносятся только те ссылки на изображения, которые имеют вид <img src=...> , а если между ними есть какие-либо параметры то уже никак. не подскажете как поменять регулярное выражение, чтоб ссылки всех изображение попадали в данный массив

а вот так, да и делов-то ;)

preg_match_all('#src=(?:\"|')(.*)(?:\"|')#isU', $text, $matches, PREG_PATTERN_ORDER);

если в обрабатываемом коде script или iframe нет, а только они могут атрибут src кроме img, то юзайте смело.

Ну, а если быть точнее то вот такая пойдёт, с учётом только img:

preg_match_all('#img.*src=(?:\"|')(.*)(?:\"|')#isU', $text, $matches, PREG_PATTERN_ORDER);

кстати, мне вот такая штука часто помогает: вычисление регулярок.

и ещё, я тут вспомнил вот: есть функция которая ещё удобнее чем pathinfo(). Она сразу имя файла возвращает из пути -- basename()

Link to comment
Share on other sites

  • 0

Я тоже хотел написать про basename(), странно, что сразу её не предложили.

Да вот подзабылась чего-то :blush:

Последнее время pathinfo() часто разбирать приходилось, вот она сразу и пришла на ум.

Link to comment
Share on other sites

  • 0

спасибо. работает)

раз у вас работает может подскажете.

мне из странички нужно у всех изображений поменять путь.

Делаю как вы.

preg_match_all("#img.*src=(?:\"|')(.*)(?:\"|')#isU", $text, $matches);
далее:
foreach ($matches[1] as $value) {
$newText = preg_replace("#img.*src=(?:\"|')(.*)(?:\"|')#isU", 'img src="/images/'. basename($value), $text);
}

и после этого все пути становятся как у первого изображения

Edited by Фрекен_Бок
Link to comment
Share on other sites

  • 0

Неправильная замена

$txt=preg_replace('#<img src=[\'"](?:.+/)?([^/]+)[\'"]#isU', "<img src=\"/images/\\1\"", $txt);

Без всяких циклов

Не забывайте, что регулярки жадные. Нужно или ограничивать жадность ([^/]+?) или ввести стоп-символы ([^/\'"]+). Ну и у первой группировки тоже самое.

Link to comment
Share on other sites

  • 0
Не забывайте, что регулярки жадные. Нужно или ограничивать жадность ([^/]+?) или ввести стоп-символы ([^/\'"]+). Ну и у первой группировки тоже самое.
То есть, мой модификатор U вообще не проканал, да?

И то, что я свои ответы проверяю перед отправкой, тоже в расчёт не берём? Ну я ж не школьник такой, чтобы дать решение и не убедиться, что оно рабочее.

Link to comment
Share on other sites

  • 0

Ах, пардон, вечно упускаю из виду пхп-шные доделки, решил что это юникод ;)

Это не пхп-шные, это перловые. (Ну это так ремарочка)

U модификатор исключительно PHP-ный, в перле его нет. Про то и говорил.

Link to comment
Share on other sites

  • 0

Неправильная замена

$txt=preg_replace('#<img src=[\'"](?:.+/)?([^/]+)[\'"]#isU', "<img src=\"/images/\\1\"", $txt);

Без всяких циклов

У меня к сожаленью никаких изменений не последовало. если же использую

$txt=preg_replace("#img.*src=(?:\"|')(.*)(?:\"|')#isU", "<img src=\"/images/\\1\"", txt);

то у меня к существующим путям впереди добавляется /images, далее старый путь и потом уже имя файла.

а нужно /images/имя_файла

Link to comment
Share on other sites

  • 0

Ах, пардон, вечно упускаю из виду пхп-шные доделки, решил что это юникод ;)

Это не пхп-шные, это перловые. (Ну это так ремарочка)

U модификатор исключительно PHP-ный, в перле его нет. Про то и говорил.

а да, действительно. Не знал что разработчики пхп отсебятину начали впихивать, спасибо за инфу

Link to comment
Share on other sites

  • 0

<?php
$a = <<<EOF
Some text
<img src="images/a.jpg">
Another text with <a href="#">link</a>
<img class="ololo" src="images/qqq.jpg" />
and img str goes here
<img src="/somedir/images/long_name.jpg">
<img src='images/qwerty.jpg'>
<img alt="wtf" src='images/b.jpg'>
EOF;

preg_match_all('~<img[^>]*src=[\'"][^\'"]*([^/\'"]*)[\'"][^>]*>~isU', $a, $matches);
print_r($matches[1]);

Вот что мой мозг выдал.

Link to comment
Share on other sites

  • 0

<?php
$a = <<<EOF
Some text
<img src="images/a.jpg">
Another text with <a href="#">link</a>
<img class="ololo" src="images/qqq.jpg" />
and img str goes here
<img src="/somedir/images/long_name.jpg">
<img src='images/qwerty.jpg'>
<img alt="wtf" src='images/b.jpg'>
EOF;

preg_match_all('~<img[^>]*src=[\'"][^\'"]*([^/\'"]*)[\'"][^>]*>~isU', $a, $matches);
print_r($matches[1]);

Вот что мой мозг выдал.

в $matches[1] будут имена изображений?

а мне нужно в тексте поменять пути у всех изображений

Link to comment
Share on other sites

  • 0


<?
$txt='текст <img src="картинка.png"> текст <img src="/image/path/to/картинка2.png" alt="2"> текст';
$txt=preg_replace('#<img src=[\'"](?:.+/)?([^/]+)[\'"]#isU', "<img src=\"/images/\\1\"", $txt);
echo $txt;
?>

текст <img src="/images/картинка.png"> текст <img src="/images/картинка2.png" alt="2"> текст

Ну почему у меня-то всё нормально работает?

Link to comment
Share on other sites

  • 0


<?
$txt='текст <img src="картинка.png"> текст <img src="/image/path/to/картинка2.png" alt="2"> текст';
$txt=preg_replace('#<img src=[\'"](?:.+/)?([^/]+)[\'"]#isU', "<img src=\"/images/\\1\"", $txt);
echo $txt;
?>

текст <img src="/images/картинка.png"> текст <img src="/images/картинка2.png" alt="2"> текст

Ну почему у меня-то всё нормально работает?

а если изображение такого вида <img width="50" height="50" src="/Image/картинка.jpg" />

то регулярное выражение не сработает

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy