Php 仅适用于filename.ext的正则表达式

Php 仅适用于filename.ext的正则表达式,php,regex,image,Php,Regex,Image,我将图像与内容分开,如下所示: 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_l

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

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

好吧,按照您的说法,只需添加?转换为正则表达式

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解析器而不是正则表达式。

试试这个

preg_match('|src=["\']([^"\'?]+)["\']|i', $img, $match);
preg_match("~src=(\"|'|)(.*?)[\"|'| ]~si", $img, $match);
无条件工作

(一)

输出

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

输出

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

输出

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