2014-12-22 5 views
2

Я создаю приложение, которое отображает только изображения, где определенное имя профиля добавлено к началу текста.Переменные и preg_match PHP

, например 3 файла в папке находятся: Rogue-fastcar.jpg, Джон-girls.png, Петры-moneyNmore.jpg

Я хотел бы вернуться только изображение, которое имеет профиль, который хранится в сессия. Пока что он показывает фотографии от всех пользователей.

Спасибо за помощь, очень ценится.

foreach ($images as $index => $image) { 
    $extension = strtolower(end(explode('.', $image))); 
    $subject = $image; 
    $profile = "$_SESSION["profile"]"; 
    $pattern = '/.$profile./'; 

    preg_match($pattern, $subject, $matches); 



    if ($matches) { 
     echo "Worse Behavior"; 
     if(!in_array($extension, $extensions)){ 
      unset($images[$index]); 
     }else{ 
      $images[$index] = array(
       'full' => $this->path. '/' . $image, 
       'thum' => $this->path. '/thumb/' . $image    
      ); 
     } 
    } 
} 
+0

'$ pattern = '/'. preg_quote ($ _ SESSION ['profile'], '/'). '/'; ' – Deadooshka

ответ

1

точки в вашем $ pattern = '/.$profile./'; должен соответствовать любому символу, который не является символом новой строки. Вероятно, вы захотите попробовать что-то вроде этого:

$ pattern = '/^$profile[-]{1}.*/' Это должно означать, что вы хотите сопоставить все, что начинается с имени профиля, одной тире и затем следует что-нибудь еще. (есть что-либо, кроме символа/n и * - 0 или более предыдущего шаблона). Надеюсь, это поможет.

+0

no it did not work, но плохо продолжать работать над этим, пока что-то не произойдет. Еще раз спасибо –

+1

oops, я забыл, что вы не можете помещать переменную в php. он делает его строкой вместо переменной. попробуйте $ pattern = '/^'.$profile.'[-]{1}.*/'; Я пробовал это со следующим тестовым кодом, и он работал: '; $ pattern = '/^'.$profile.'[-]{1}.*/'; echo $ pattern. '
'; if (preg_match ("$ pattern", "Rogue-fastcar.JPG ")) { \t \t эхо„яй“; } еще { \t не эхо„никакой радости“; } –

+0

Да она прекрасно работала Люби простоту этого кода –

0

Ну, есть по крайней мере две проблемы в вашем PHP-код: в первую очередь это ошибка синтаксиса:

$profile = "$_SESSION["profile"]"; 

попробовать с этим:

$profile = $_SESSION["profile"]; 

тогда ваше регулярное выражение неправильно, потому что . соответствует любому персонажу, но он соответствует только одному. Таким образом, вам нужно использовать *, который соответствует любому символу и любой множественности.

2

Кажется, у вас было несколько проблем, ускоряющих кавычки и конкатенации строк.

Похоже, вы идете немного обходным путем, чтобы делать то, что вам нужно.

Что мы можем сделать, это:

// Get length of $_SESSION['profile'] 
$profileLength = strlen($_SESSION['profile']); 

// Get that amount of characters from the image name starting at the first character 
$imagePrefix = substr($image, 0, $profileLength); 

// Compare the first X characters of image names to $_SESSION['profile'] 
if($imagePrefix == $_SESSION['profile']){..} 

// Put it together now: 
foreach ($images as $index => $image) { 
    $extension = strtolower(end(explode('.', $image))); 
    // $subject = $image; 
    // $profile = "$_SESSION["profile"]"; 
    // $pattern = '/.$profile./'; 
    // preg_match($pattern, $subject, $matches); 

    // if ($matches) { 

    $profileLength = strlen($_SESSION['profile']); 
    $imagePrefix = substr($image, 0, $profileLength); 

    if($imagePrefix == $_SESSION['profile']){ 
     echo "Worse Behavior"; 

     if(!in_array($extension, $extensions)){ 
      unset($images[$index]); 
     }else{ 
      $images[$index] = array(
       'full' => $this->path. '/' . $image, 
       'thum' => $this->path. '/thumb/' . $image 
      ); 
     } 
    } 
} 

Однако для устранения причин, почему он не работает в первую очередь:

foreach ($images as $index => $image) { 
    $extension = strtolower(end(explode('.', $image))); 
    $subject = $image; 

    // This should not be quoted 
    // $profile = "$_SESSION["profile"]"; 
    $profile = $_SESSION["profile"]; 

    // The concatenation here is close, but you forgot some single quotes 
    // $pattern = '/.$profile./'; 
    $pattern = '/'.$profile.'/'; 

    // Not only that, but you can combine the two lines into: 
    $pattern = '/' . $_SESSION['profile'] . '/'; 

    // Furthermore, when putting anything into a regular expression, you should sanitize: 
    $pattern = '/' . preg_quote($_SESSION['profile']) . '/'; 

    preg_match($pattern, $subject, $matches); 

    // $matches may be interpreted as true or false depending on array length. Try instead.. 
    // if ($matches) { 
    if (count($matches) > 0) { 
     echo "Worse Behavior"; 
     if(!in_array($extension, $extensions)){ 
      unset($images[$index]); 
     }else{ 
      $images[$index] = array(
       'full' => $this->path. '/' . $image, 
       'thum' => $this->path. '/thumb/' . $image    
      ); 
     } 
    } 
} 
+0

Да, я вижу, что у вас там, пытаясь заставить его работать часами, вы сделали это за несколько секунд. Спасибо еще раз за помощь –

+0

Нет проблем. Не забудьте принять ответ если ваша проблема решена! –

0

Просто указывая на то, что есть более умные способы (и более читаемым), чтобы получить расширение файла

$extension = pathinfo($image, PATHINFO_EXTENSION); 
0

Используйте этот код для получения изображения из папки с именем профиля

$pathToImagesFolder = "/images/"; // path to your images folder 
// 
$profileName = $_SESSION["profile"]; 
// Open a directory, and read its contents 
if (is_dir($pathToImagesFolder)){ 
    if ($dh = opendir($pathToImagesFolder)){ 
    while (($file = readdir($dh)) !== false){ 
     if($file != '..' && $file != '.') { 
       $fileDetails = explode('.',$file); 
       if(is_array($fileDetails) && $fileDetails[0] == $profileName) { 
         echo $file; //Image with extension 
         //Your Code 
       } 
     } 
    } 
    closedir($dh); 
    } 
}