Регулярное выражение только для filename.ext

Я отделяю изображения от контента следующим образом:

list($img, $string) = explode('>', $string, 2);
$isSlashes = (stripos($img, '\\')!==false);
if ($isSlashes) {
  $img = stripslashes($img);
}
preg_match('|src=["\']([^"\']+)["\']|i', $img, $match);
if (empty($match[1])) {
  imgres_log('Image src not found in '.$img, 'error');
  imgres_joinContent($content, $img, $string, $isSlashes);
  continue;
}
$src = $match[1];

... обычно это работает, за исключением случаев, когда изображения снабжены строкой запроса, например: img0880.jpg?itok=pUzE5f9d что все портит. Как мне удалить часть после ? отметка?

2 ответа

Решение

Ну, чтобы сделать то, что вы говорите, просто добавить? в ваше регулярное выражение.

preg_match('|src=["\']([^"\'?]+)["\']|i', $img, $match);

Но или на самом деле два ноута. 1) если изображение имеет строку запроса после?, Оно является частью URL изображения. Например, image.jpg?foo=bar может относиться к изображению, отличному от image.jpg?foo=baz. 2) вы разрешаете одинарные и двойные кавычки здесь. но что если там есть iss src="joe's_image.jpg" или src=image.jpg? оба эти случая действительны в формате HTML и завершатся неудачно с вашим скриптом.

Решение: я предлагаю использовать парсер DOM вместо регулярного выражения.

Попробуй это

preg_match("~src=(\"|'|)(.*?)[\"|'| ]~si", $img, $match);

работа для всех условий

лайк

1)

src="image.jpg?dasd=a5fsd"

выход

Array
(
  [0] => src="image.jpg?dasd=a5fsd"
  [1] => "
  [2] => image.jpg?dasd=a5fsd
)

2)

src='image.jpg?dasd=a5fsd'

выход

Array
(
   [0] => src='image.jpg?dasd=a5fsd'
   [1] => '
   [2] => image.jpg?dasd=a5fsd
)

3)

src=image.jpg?dasd=a5fsd

выход

Array
(
  [0] => src=image.jpg?dasd=a5fsd 
  [1] => 
  [2] => image.jpg?dasd=a5fsd
)
Другие вопросы по тегам