WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru
функция не описана

PclZip::privExtractByRule() public WP 1.0

Function : privExtractByRule() Description : Extract a file or directory depending of rules (by index, by name, ...) Parameters : $p_file_list : An array where will be placed the properties of each extracted file $p_path : Path to add while writing the extracted files $p_remove_path : Path to remove (from the file memorized path) while writing the extracted files. If the path does not match the file path, the file is extracted with its memorized path. $p_remove_path does not apply to 'list' mode. $p_path and $p_remove_path are commulative. Return Values :
1 on success,0 or less on error (see error code list)

Это метод класса: PclZip{}

Хуков нет.

Возвращает

Null. Ничего.

Использование

$PclZip = new PclZip();
$PclZip->privExtractByRule( $p_file_list, $p_path, $p_remove_path, $p_remove_all_path, $p_options );

Код PclZip::privExtractByRule() WP 5.5.1

wp-admin/includes/class-pclzip.php
<?php
function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
{
  $v_result=1;

  // ----- Magic quotes trick
  $this->privDisableMagicQuotes();

  // ----- Check the path
  if (   ($p_path == "")
	    || (   (substr($p_path, 0, 1) != "/")
		    && (substr($p_path, 0, 3) != "../")
			&& (substr($p_path,1,2)!=":/")))
    $p_path = "./".$p_path;

  // ----- Reduce the path last (and duplicated) '/'
  if (($p_path != "./") && ($p_path != "/"))
  {
    // ----- Look for the path end '/'
    while (substr($p_path, -1) == "/")
    {
      $p_path = substr($p_path, 0, strlen($p_path)-1);
    }
  }

  // ----- Look for path to remove format (should end by /)
  if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
  {
    $p_remove_path .= '/';
  }
  $p_remove_path_size = strlen($p_remove_path);

  // ----- Open the zip file
  if (($v_result = $this->privOpenFd('rb')) != 1)
  {
    $this->privSwapBackMagicQuotes();
    return $v_result;
  }

  // ----- Read the central directory information
  $v_central_dir = array();
  if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  {
    // ----- Close the zip file
    $this->privCloseFd();
    $this->privSwapBackMagicQuotes();

    return $v_result;
  }

  // ----- Start at beginning of Central Dir
  $v_pos_entry = $v_central_dir['offset'];

  // ----- Read each entry
  $j_start = 0;
  for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
  {

    // ----- Read next Central dir entry
    @rewind($this->zip_fd);
    if (@fseek($this->zip_fd, $v_pos_entry))
    {
      // ----- Close the zip file
      $this->privCloseFd();
      $this->privSwapBackMagicQuotes();

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read the file header
    $v_header = array();
    if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
    {
      // ----- Close the zip file
      $this->privCloseFd();
      $this->privSwapBackMagicQuotes();

      return $v_result;
    }

    // ----- Store the index
    $v_header['index'] = $i;

    // ----- Store the file position
    $v_pos_entry = ftell($this->zip_fd);

    // ----- Look for the specific extract rules
    $v_extract = false;

    // ----- Look for extract by name rule
    if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
        && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {

        // ----- Look if the filename is in the list
        for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {

            // ----- Look for a directory
            if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {

                // ----- Look if the directory is in the filename path
                if (   (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
                    && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
                    $v_extract = true;
                }
            }
            // ----- Look for a filename
            elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
                $v_extract = true;
            }
        }
    }

    // ----- Look for extract by ereg rule
    // ereg() is deprecated with PHP 5.3
    /*
    else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
             && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {

        if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {
            $v_extract = true;
        }
    }
    */

    // ----- Look for extract by preg rule
    else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
             && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {

        if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
            $v_extract = true;
        }
    }

    // ----- Look for extract by index rule
    else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
             && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {

        // ----- Look if the index is in the list
        for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {

            if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
                $v_extract = true;
            }
            if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
                $j_start = $j+1;
            }

            if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
                break;
            }
        }
    }

    // ----- Look for no rule, which means extract all the archive
    else {
        $v_extract = true;
    }

	  // ----- Check compression method
	  if (   ($v_extract)
	      && (   ($v_header['compression'] != 8)
		      && ($v_header['compression'] != 0))) {
        $v_header['status'] = 'unsupported_compression';

        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {

            $this->privSwapBackMagicQuotes();

            PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
			                       "Filename '".$v_header['stored_filename']."' is "
				  	    	  	   ."compressed by an unsupported compression "
				  	    	  	   ."method (".$v_header['compression'].") ");

            return PclZip::errorCode();
		  }
	  }

	  // ----- Check encrypted files
	  if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
        $v_header['status'] = 'unsupported_encryption';

        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {

            $this->privSwapBackMagicQuotes();

            PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
			                       "Unsupported encryption for "
				  	    	  	   ." filename '".$v_header['stored_filename']
								   ."'");

            return PclZip::errorCode();
		  }
  }

    // ----- Look for real extraction
    if (($v_extract) && ($v_header['status'] != 'ok')) {
        $v_result = $this->privConvertHeader2FileInfo($v_header,
		                                        $p_file_list[$v_nb_extracted++]);
        if ($v_result != 1) {
            $this->privCloseFd();
            $this->privSwapBackMagicQuotes();
            return $v_result;
        }

        $v_extract = false;
    }

    // ----- Look for real extraction
    if ($v_extract)
    {

      // ----- Go to the file position
      @rewind($this->zip_fd);
      if (@fseek($this->zip_fd, $v_header['offset']))
      {
        // ----- Close the zip file
        $this->privCloseFd();

        $this->privSwapBackMagicQuotes();

        // ----- Error log
        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

        // ----- Return
        return PclZip::errorCode();
      }

      // ----- Look for extraction as string
      if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {

        $v_string = '';

        // ----- Extracting the file
        $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);
        if ($v_result1 < 1) {
          $this->privCloseFd();
          $this->privSwapBackMagicQuotes();
          return $v_result1;
        }

        // ----- Get the only interesting attributes
        if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
        {
          // ----- Close the zip file
          $this->privCloseFd();
          $this->privSwapBackMagicQuotes();

          return $v_result;
        }

        // ----- Set the file content
        $p_file_list[$v_nb_extracted]['content'] = $v_string;

        // ----- Next extracted file
        $v_nb_extracted++;

        // ----- Look for user callback abort
        if ($v_result1 == 2) {
        	break;
        }
      }
      // ----- Look for extraction in standard output
      elseif (   (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
		        && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
        // ----- Extracting the file in standard output
        $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
        if ($v_result1 < 1) {
          $this->privCloseFd();
          $this->privSwapBackMagicQuotes();
          return $v_result1;
        }

        // ----- Get the only interesting attributes
        if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
          $this->privCloseFd();
          $this->privSwapBackMagicQuotes();
          return $v_result;
        }

        // ----- Look for user callback abort
        if ($v_result1 == 2) {
        	break;
        }
      }
      // ----- Look for normal extraction
      else {
        // ----- Extracting the file
        $v_result1 = $this->privExtractFile($v_header,
		                                      $p_path, $p_remove_path,
											  $p_remove_all_path,
											  $p_options);
        if ($v_result1 < 1) {
          $this->privCloseFd();
          $this->privSwapBackMagicQuotes();
          return $v_result1;
        }

        // ----- Get the only interesting attributes
        if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
        {
          // ----- Close the zip file
          $this->privCloseFd();
          $this->privSwapBackMagicQuotes();

          return $v_result;
        }

        // ----- Look for user callback abort
        if ($v_result1 == 2) {
        	break;
        }
      }
    }
  }

  // ----- Close the zip file
  $this->privCloseFd();
  $this->privSwapBackMagicQuotes();

  // ----- Return
  return $v_result;
}