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
)