PHP тест, если строка содержит одну из трех строк? - PullRequest
3 голосов
/ 26 апреля 2011

Как лучше всего добиться следующего:

У меня есть переменная $img, содержащая, например, myimage_left.jgp, someimage_center.jpg или img_right.jpg

Какой лучший способ проверить _left, _right или _center имени файла, извлечь это значение и сохранить его в переменной?

Итак, у меня есть $img, который уже содержит полное базовое имя файла. И мне нужно иметь $pos, который должен содержать _center или _left или _right.

Какой способ это сделать? preg_match, strpos и т. д.?

Ответы [ 4 ]

12 голосов
/ 26 апреля 2011

Регулярное выражение будет самым простым:

$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 следует точка last в имени файла (что практически означает, что базовое имя заканчивается спецификацией l / r / c):

preg_match('/(_(left|right|center))\\.[^\\.]*$/', $input, $matches);

и т. Д.

Если вы используете эти регулярные выражения, вы найдете результат в $matches[1] вместо $matches[0].

1 голос
/ 26 апреля 2011

Не-регулярное выражение

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

if ( in_array( $pos = end( explode( '_',  basename( $img, '.jpg' ) ) ), $find ) ) {
    echo $pos;
}
1 голос
/ 26 апреля 2011

У кого-то, вероятно, будет более элегантное решение, но я бы использовал 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
}

Предполагается, что вы не можете иметь более одного значения для поз.

0 голосов
/ 26 апреля 2011

Если вы хотите избежать регулярных выражений, вы можете просто сделать

  $underScores = explode("_", $img);
  $endOfFileName = end($underScores);
  $withoutExtensionArr = explode(".", $img);
  $leftRightOrCenter = $withoutExtensionArr[0];

Затем проверьте содержимое слева направо или по центру

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...