如何实现以下功能:
我有一个包含例如 myimage_left.jgp
, someimage_center.jpg
或 img_right.jpg
的变量$img
最好的方法是测试文件名中的_left
, _right
或_center
,并提取该值并存储在一个变量中。
所以我有一个已经包含完整基本名称的$img
变量。我需要有一个$pos
变量,它应该包含_center
或_left
或_right
。
怎么做呢?preg_match、strpos等?
正则表达式是最简单的方法:
$input = 'foo_left.jpg';
if(!preg_match('/_(left|right|center)/', $input, $matches)) {
// no match
}
$pos = $matches[0]; // "_left", "_right" or "_center"
更新:
为了更为谨慎的做法(如果文件名中可能存在多个"_left"
等实例),您可以考虑添加正则表达式。
只有当l/r/c后跟一个点时,才会匹配:
preg_match('/(_(left|right|center))\./', $input, $matches);
只有在文件名的最后一个点紧随 l/r/c 之后时,才会匹配成功(这实际上意味着基本名称以 l/r/c 为结尾):
preg_match('/(_(left|right|center))\\.[^\\.]*$/', $input, $matches);
等等再说。
如果使用这些正则表达式,你将在$matches[1]
中找到结果,而不是$matches[0]
。
可能有更优雅的解决方案,但我会像你建议的那样使用strpos。
if (strpos(strtoupper($img), '_LEFT') > 0) $pos = '_LEFT'
你可以将其扩展为
$needleArray = arra('_LEFT', '_CENTER', '_RIGHT');
foreach ($needleArray as $needle) {
if (strpos(strtoupper($img), $needle) > 0) $pos = $needle
}
假设您不能对 pos 有多个值。
非正则表达式选项
$img = 'myimage_left.jpg';
$find = array( 'left', 'center', 'right' );
if ( in_array( $pos = end( explode( '_', basename( $img, '.jpg' ) ) ), $find ) ) {
echo $pos;
}
$underScores = explode("_", $img);
$endOfFileName = end($underScores);
$withoutExtensionArr = explode(".", $img);
$leftRightOrCenter = $withoutExtensionArr[0];
然后检查左侧、右侧或中心的内容
_left.jpg.我可以有很多“扩展名”如果我想要.png_center.png
。 - Jon[^.]
。此外,我会使用“+”而不是“*”,以确保有一些文件扩展名。 - NikiC$matches[0]
将包含完整的字符串。你需要$matches[1]
,它将包含第一个捕获组。 - Marc B