1

我将图像与内容分开,如下所示:

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这会搞砸一切。如何删除?标记后的部分?

4

2 回答 2

2

好吧,按照你说的做,只需添加 ? 进入你的正则表达式。

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

但是,或者实际上是两个但是。1) 如果图像在 ? 之后有查询字符串,则它是图像 URL 的一部分。像 image.jpg?foo=bar 可能指的是不同于 image.jpg?foo=baz 的图像。2)你在这里允许单引号和双引号。但是如果有 src="joe's_image.jpg" 或 src=image.jpg 怎么办?这两种情况都是 HTML 有效的,并且会因您的脚本而失败。

解决方案:我建议使用 DOM 解析器而不是正则表达式。

于 2013-03-08T12:11:21.780 回答
1

试试这个

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
)
于 2013-03-08T12:36:40.460 回答