PHP如何测试字符串是否包含三个字符串中的任意一个?

3

如何实现以下功能:

我有一个包含例如 myimage_left.jgp, someimage_center.jpgimg_right.jpg 的变量$img

最好的方法是测试文件名中的_left, _right_center,并提取该值并存储在一个变量中。

所以我有一个已经包含完整基本名称的$img变量。我需要有一个$pos变量,它应该包含_center_left_right

怎么做呢?preg_match、strpos等?

4个回答

12

正则表达式是最简单的方法:

$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]


如果_left|right|center恰好位于字符串中间,这将无法正常工作。 - Doug T.
@Czechnology,它会匹配_left_blahblahblah.jpg。不确定这是否合法。 - Doug T.
@DougT:除非我们能对文件名做出一些假设,否则生活将变得非常艰难。想想_left.jpg.我可以有很多“扩展名”如果我想要.png_center.png - Jon
1
PS:在字符组中您不需要转义点,只需写[^.]。此外,我会使用“+”而不是“*”,以确保有一些文件扩展名。 - NikiC
实际上,$matches[0] 将包含完整的字符串。你需要 $matches[1],它将包含第一个捕获组。 - Marc B
@MarcB:$matches[0] 对于预更新示例很好。我会更新更新以使其更加明确。 :) - Jon

1

可能有更优雅的解决方案,但我会像你建议的那样使用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 有多个值。


1

非正则表达式选项

$img = 'myimage_left.jpg';
$find = array( 'left', 'center', 'right' );

if ( in_array( $pos = end( explode( '_',  basename( $img, '.jpg' ) ) ), $find ) ) {
    echo $pos;
}

0
如果你想避免使用正则表达式,你可以这样做
  $underScores = explode("_", $img);
  $endOfFileName = end($underScores);
  $withoutExtensionArr = explode(".", $img);
  $leftRightOrCenter = $withoutExtensionArr[0];

然后检查左侧、右侧或中心的内容


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接