我有“原始列表”,我正在尝试使用 php 将其转换为“所需列表”。当 .jpg 出现在字符串末尾时,我什么也不做。如果 .jpg 不是字符串的末尾,我想将 .jpg 添加到末尾。 “原始列表”作为一个长字符串存储在 $badPhotos 中。
Original List Desired List
http://i.imgur.com/4ReyOhl http://i.imgur.com/4ReyOh1.jpg
http://i.imgur.com/4ReyOh2.jpg http://i.imgur.com/4ReyOh2.jpg
http://i.imgur.com/4ReyOh3 http://i.imgur.com/4ReyOh3.jpg
http://i.imgur.com/4ReyOh4 http://i.imgur.com/4ReyOh4.jpg
http://i.imgur.com/4ReyOh5.jpg http://i.imgur.com/4ReyOh5.jpg
如果有人添加了 ,我一直在使用以下内容来修改字符串,其中 .属于,但现在只有当字符串不以 .jpg 结尾时我才需要修改字符串。
$badPhotos = str_replace(',', '.', $badPhotos);
想法? 谢谢!
只是为了好玩,如果存在则将其删除,然后添加它:
$badPhotos = rtrim($badPhotos, '.jpg') . '.jpg';
对于数组:
$badPhotos = array_map(function($v) {
return rtrim($v, '.jpg') . '.jpg';
},
$badPhotos);
或者更适合文件名,只需获取不带扩展名的名称,然后添加它:
$badPhotos = pathinfo($badPhotos, PATHINFO_FILENAME) . '.jpg';
这是一种方法:
$str = 'http://i.imgur.com/4ReyOhl';
if (substr($str, -4, 4) != '.jpg') {
$str .= '.jpg';
}
array_walk
:
$arr[] = 'http://i.imgur.com/4ReyOhl';
array_walk($arr, function (&$v) {
$v = substr($v, -4, 4) != '.jpg' ? $v . '.jpg' : $v;
});
使用preg_replace
功能的“一行”解决方案:
$url_list = [
'http://i.imgur.com/4ReyOhl',
'http://i.imgur.com/4ReyOh2.JPG',
'http://i.imgur.com/4ReyOh3'
];
$url_list = preg_replace("/\/[^.]+(?!\.jpg)$/i", "$0.jpg", $url_list);
print_r($url_list);
输出:
Array
(
[0] => http://i.imgur.com/4ReyOhl.jpg
[1] => http://i.imgur.com/4ReyOh2.JPG
[2] => http://i.imgur.com/4ReyOh3.jpg
)
您可以使用 strstr() 来确定它是否已经在字符串中。
$rightPhotos = array();
foreach($badPhotos as $photo){
if !(strstr(substr($photo,-4), ".jpg")){
$photo .= ".jpg";
}
$rightPhotos[] = $photo;
}
通过 php 检查 JPG、PNG 和其他图像扩展名
功能preg_match
$string = "http://i.imgur.com/4ReyOhl";
if (preg_match('/(\.jpg|\.png|\.bmp)$/i', $String)) {
echo "Already have an extention";
} else{
echo "not image";
$string .= ".jpg";
}
根据OP的最新评论,其中
$badPhotos
是一个数组,以下是您可以采取的有效方法:
$badPhotos = array(...);
foreach($badPhotos as $key => $value) {
if(substr($value, -4, 4) !== '.jpg' || substr($value, -5, 5) !== '.jpeg') {
$badPhotos[$key] = $value . ".jpg";
}
}
注意: 这使用了 @MisterMartin 的答案的修改方法,应用于数组的循环。它还使用了 @uom-pgregorio 在他关于 jpg 图像的评论中提到的额外检查,这些图像可能以
.jpeg
结尾。
$urls = array(
'http://i.imgur.com/4ReyOhl',
'http://i.imgur.com/4ReyOh2.jpg',
'http://i.imgur.com/4ReyOh3',
'http://i.imgur.com/4ReyOh4',
'http://i.imgur.com/4ReyOh5.jpg',
);
$urls = array_map(function($value) {
$path_info = pathinfo($value);
if(!array_key_exists('extension', $path_info) || $path_info['extension'] != 'jpg') {
return $value . '.jpg';
}
return $value;
}, $urls);
var_dump($urls);
我希望这是一个非常可靠的解决方案。另外,我更喜欢 AbraCadaver 和 RomanPerekhrest 答案中的任何一个,因为他们的解决方案确实更简单。不管怎样,我已经尽力给你解决方案了!
我几乎喜欢Roman的回答,但还可以进一步减少。
简单的
preg_replace()
调用将从字符串末尾开始,然后查找 .jpg
,并且仅在文件扩展名尚未位于字符串末尾时附加文件扩展名。
代码:(演示)
$url_list = [
'http://i.imgur.com/4ReyOhl',
'http://i.imgur.com/4ReyOh2.jpg',
'http://i.imgur.com/4ReyOh3'
];
var_export(
preg_replace("/(?<!\.jpg)$/", ".jpg", $url_list)
);
输出:
array (
0 => 'http://i.imgur.com/4ReyOhl.jpg',
1 => 'http://i.imgur.com/4ReyOh2.jpg',
2 => 'http://i.imgur.com/4ReyOh3.jpg',
)