Каков наилучший способ добиться следующего:
У меня есть переменная $img
содержащая, например, myimage_left.jgp
, someimage_center.jpg
или img_right.jpg
Каков наилучший способ проверить для _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];
Затем проверьте содержимое влево или вправо