Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2017, 17:17   #21
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
попробуйте:

Код:
$headarr=http_parse_headers($header );
var_dump($headarr['Delivery-date']);
Спасибо! Всё работает) Буду под учивать далее.
YARK0S вне форума Ответить с цитированием
Старый 10.07.2017, 17:37   #22
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

[" Content preview"]=>
string(81) "ФПМГШМГИ уц атшщ уцатшц ауцт уцатшуцатцушта"
Длина сообщения 787 символов, а выводит только 6 слов
В этом куске кода, что раньше был, всю строку добавляло полностью, все 787.
Код:
if( !function_exists( 'http_parse_headers' ) ) {
    function http_parse_headers( $text )
    {
        $retVal = array();
        $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $text));
        foreach( $fields as $field ) {
            if( preg_match('/([^:]+): (.+)/m', $field, $match) ) {
                $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
                if( isset($retVal[$match[1]]) ) {
                    $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
                } else {
                    $retVal[$match[1]] = trim($match[2]);
                }
            }
        }
        return $retVal;
    }
}
А в новом только часть 87 символов
Код:
if (!function_exists('http_parse_headers')) {
    function http_parse_headers($text) {
        $headers = array();
        $key = '';

        foreach(explode("\n", $text) as $i => $h) {
            $h = explode(':', $h, 2);

            if (isset($h[1])) {
                if (!isset($headers[$h[0]]))
                    $headers[$h[0]] = trim($h[1]);
                elseif (is_array($headers[$h[0]])) {
                    $headers[$h[0]] = array_merge($headers[$h[0]], array(trim($h[1])));
                }
                else {
                    $headers[$h[0]] = array_merge(array($headers[$h[0]]), array(trim($h[1])));
                }

                $key = $h[0];
            }
            else {
                if (substr($h[0], 0, 1) == "\t")
                    $headers[$key] .= "\r\n\t".trim($h[0]);
                elseif (!$key)
                    $headers[0] = trim($h[0]);
            }
        }

        return $headers;
    }
}

Последний раз редактировалось YARK0S; 10.07.2017 в 19:21.
YARK0S вне форума Ответить с цитированием
Старый 10.07.2017, 19:24   #23
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Скрины
Изображения
Тип файла: jpg 4.jpg (8.0 Кб, 115 просмотров)
Тип файла: jpg 5.JPG (14.5 Кб, 120 просмотров)
YARK0S вне форума Ответить с цитированием
Старый 10.07.2017, 19:57   #24
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от YARK0S Посмотреть сообщение
В этом куске кода, что раньше был, всю строку добавляло полностью, все 787.
...
А в новом только часть 87 символов
Значит, пробуй допилить «этот кусок кода, что раньше был» до работоспособного с твоим текстом состояния.
Или таки попробуй уже применить функцию из следующего комментария на странице, которую предложил Alex11223. Только описание к ней внимательно читай.
Andkorol вне форума Ответить с цитированием
Старый 10.07.2017, 23:17   #25
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Значит, пробуй допилить «этот кусок кода, что раньше был» до работоспособного с твоим текстом состояния.
Или таки попробуй уже применить функцию из следующего комментария на странице, которую предложил Alex11223. Только описание к ней внимательно читай.
Хорошо, спасибо ребята.
YARK0S вне форума Ответить с цитированием
Старый 11.07.2017, 11:34   #26
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Получаеться в нашей функции, мы подтягиваем только первую строчку, а нужно как во второй подтягивать все строчки, которые пренадлежат этому заголовку.
Сам заголовок:

Content preview: ФПМГШМГИ уц атшщ уцатшц ауцт уцатшуцатцушта
вт фвт уцат щтвтц цута шатуцт уца ытсывта
ывоти ыоаываывибвыи ыва . вы аывга щырщаш
ыщаыа ыв.ва рыщарыщваыаж dshiufhius fhdeheifh ehf eh
adflsff sbf bsjbsfrbuf sbsjdbf herfybsfbdsjbfj dsfewb vfb jsbf dsjjf dsbjbyrbefsbj
gdjf +32549844981219 efewhfg bfyg wfu wfg f few +564798984 ewfjewfhein inwef
iewnfiuewnfewf. аоукашуташкуат ОГшоалмт уктт кптыатшт
тывл а тыат тавылат вшатшатув аи авцауотвылтпавп
пт уатавпвптвштаывт уга выта вытвпа ваптав
атцватукшптав вт птв твуащ ь. [...]
YARK0S вне форума Ответить с цитированием
Старый 11.07.2017, 14:18   #27
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Может кому то пригодится:
Код:
function http_parse_headers( $header ) {
    $retVal = array();
    $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
    foreach( $fields as $field ) {
        if( preg_match('/([^:]+): (.+)/m', $field, $match) ) {
            $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
            if( isset($retVal[$match[1]]) ) {
                if ( is_array( $retVal[$match[1]] ) ) {
                    $i = stristr($field,':', true);
                    $retVal[$match[1]][$i] = $match[2];
                }
                else {
                    $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
                }
            } else {
                $retVal[$match[1]] = trim($match[2]);
            }
        }
    }
    return $retVal;
}
По хитрому, за то работает.
YARK0S вне форума Ответить с цитированием
Старый 11.07.2017, 14:52   #28
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от YARK0S Посмотреть сообщение
Может кому то пригодится:
Код:
function http_parse_headers( $header ) {
    $retVal = array();
    $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
    foreach( $fields as $field ) {
        if( preg_match('/([^:]+): (.+)/m', $field, $match) ) {
            $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
            if( isset($retVal[$match[1]]) ) {
                if ( is_array( $retVal[$match[1]] ) ) {
                    $i = stristr($field,':', true);
                    $retVal[$match[1]][$i] = $match[2];
                }
                else {
                    $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
                }
            } else {
                $retVal[$match[1]] = trim($match[2]);
            }
        }
    }
    return $retVal;
}
По хитрому, за то работает.
Никому не пригодится.
Потому, что не работает – ни «по хитрому», ни ещё как-либо:
PHP код:
function http_parse_headers$header ) {
    
$retVal = array();
    
$fields explode("\r\n"preg_replace('/\x0D\x0A[\x09\x20]+/'' '$header));
    foreach( 
$fields as $field ) {
        if( 
preg_match('/([^:]+): (.+)/m'$field$match) ) {
            
$match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e''strtoupper("\0")'strtolower(trim($match[1])));
            if( isset(
$retVal[$match[1]]) ) {
                if ( 
is_array$retVal[$match[1]] ) ) {
                    
$i stristr($field,':'true);
                    
$retVal[$match[1]][$i] = $match[2];
                }
                else {
                    
$retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
                }
            } else {
                
$retVal[$match[1]] = trim($match[2]);
            }
        }
    }
    return 
$retVal;
}

$headers "content-type: text/html; charset=UTF-8\r\n".
  
"Server: Funky/1.0\r\n".
  
"Set-Cookie: foo=bar\r\n".
  
"Set-Cookie: baz=quux\r\n".
  
"Folded: works\r\n\ttoo\r\n".
  
"Content preview: Credibly embrace functionalized sources through diverse infrastructures.
  Efficiently evolve extensive web services whereas resource maximizing bandwidth. 
  Distinctively innovate intuitive best practices via out-of-the-box paradigms. 
  Efficiently plagiarize optimal innovation whereas functionalized applications. 
  Phosfluorescently reconceptualize cross-unit content via pandemic bandwidth. 
  Appropriately re-engineer multidisciplinary channels through intuitive imperatives."
;

var_dump(http_parse_headers($headers)); 
В результате в 'Content Preview' – всё та же только первая строка:
Код:
array (size=5)
  'Content-Type' => string 'text/html; charset=UTF-8' (length=24)
  'Server' => string 'Funky/1.0' (length=9)
  'Set-Cookie' => 
    array (size=2)
      0 => string 'foo=bar' (length=7)
      1 => string 'baz=quux' (length=8)
  'Folded' => string 'works too' (length=9)
  'Content Preview' => string 'Credibly embrace functionalized sources through diverse infrastructures.' (length=72)
Да ещё при этом ругается на устаревший модификатор в регулярном выражении:
Цитата:
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in ...
Andkorol вне форума Ответить с цитированием
Старый 11.07.2017, 23:30   #29
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

У меня работает:
Ща весь код скину, конечно каряво, но работает. Завтра буду исправлять, и пытаться привести всё в нормальный вид.
Код:
<?php
$number_message=3; // потом здесь будет по другому
//задаем форматированный вывод, чтобы удобнее было читать ответы по строкам
echo '<pre>';
$login='**********';
$pass='***********';

//подключаемся к серверу
fgets($f,1024);
echo "Подключение к серверу:\r\n";
$f=fsockopen('ip',110,$errno,$errstr,10);
print fgets($f,1024);

fputs($f,"USER $login\r\n");
print fgets($f,1024);

fputs($f,"PASS $pass\r\n");
print fgets($f,1024);

//Узнаю количество сообщений
stat_message($f);
//Узнаю вес каждого сообщения
list_message($f);
//Выбор сообщения по номеру
retr_message($f,$number_message);

$text .= get_data($f);
var_dump($text);
//Делю всё на заголовки и тело, и вкидаю в массив, где заголок, это ключ, а тело - это его значение
function http_parse_headers( $header ) {
    $retVal = array();
    $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
    foreach( $fields as $field ) {
        if( preg_match('/([^:]+): (.+)/m', $field, $match)){
            $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
            if( isset($retVal[$match[1]]) ) {
                if ( is_array( $retVal[$match[1]] ) ) {
                    $i = stristr($field,':', true);
                    $retVal[$match[1]][$i] = $match[2];
                }
                else {
                    $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
                }
            } else {
                $retVal[$match[1]] = trim($match[2]);
            }
        }
    }
    return $retVal;
}

// Временая переменая, котороя поможет выводить нужные мне заголовки
$temp=http_parse_headers($text);

// Переменные которые я буду вызывать в другом проекте
$date_mesagge=$temp[""]["Date"];
$user=$temp[""]["To"];
$sender_message=decode_mime_string($temp[""]["From"]);
$email_sender=decode_mime_string($temp[""]["To"]);
$subject_message=decode_mime_string($temp[""]["Subject"]);
$text_message=stristr($temp[""][" Content preview"],'[...]',true);
$file_message=$temp[""]["Content-Type"];

// Обычный вывод всего что мне нужно, чтобы визуально за всем следить
printf("Дата получения: ".$temp[""]["Date"]."\r\n");
printf("Пользователь: ".$temp[""]["To"]."   ");
printf("Отправитель: ".decode_mime_string($temp[""]["From"])."   ");
printf("Email: ".stristr($temp[""]["Received"],'by',true)."\r\n");
printf("Тема сообщения: ".decode_mime_string($temp[""]["Subject"]."\r\n"));
printf("Сообщение: ".stristr($temp[""][" Content preview"],'[...]',true)."\r\n");
printf("Файлы: ".$temp[""]["Content-Type"]."\r\n");


// Метод для вывода всей информации от Pop3
function get_data($f)
{
    $data="";
    while (!feof($f)) {
        $buffer = chop(fgets($f,1024));
        $data .= "$buffer\r\n";
        if(trim($buffer) == ".") break;
    }
    return $data;
}

//Декодер для зашифрованых частей сообщения
function decode_mime_string($subject) {
    $string = $subject;
    $newresult='';
    if(($pos = strpos($string,"=?")) === false) return $string;
    while(!($pos === false)) {
        $newresult .= substr($string,0,$pos);
        $string = substr($string,$pos+2,strlen($string));
        $intpos = strpos($string,"?");
        $charset = substr($string,0,$intpos);
        $enctype = strtolower(substr($string,$intpos+1,1));
        $string = substr($string,$intpos+3,strlen($string));
        $endpos = strpos($string,"?=");
        $mystring = substr($string,0,$endpos);
        $string = substr($string,$endpos+2,strlen($string));
        if($enctype == "q") $mystring = quoted_printable_decode(preg_replace("_"," ",$mystring));
        else if ($enctype == "b") $mystring = base64_decode($mystring);
        $newresult .= $mystring;
        $pos = strpos($string,"=?");
    }

    $result = $newresult.$string;
    if(preg_match("koi8", $subject)) $result = convert_cyr_string($result, "k", "w");
    if(preg_match("KOI8", $subject)) $result = convert_cyr_string($result, "k", "w");
    return $result;
}

// Метод удаления сообщения по номеру
function delete_message($f,$number_message){
    fputs($f,"DELE $number_message\r\n");
    print fgets($f,1024);
    fputs($f,"QUIT\r\n");
}

// Метод для откату транзакций в пределах текущего сеанса. К примеру, если вы случайно пометили сообщение на удаление, то можно убрать метки, послав команду RSET.
function rset_message($f){
    fputs($f,"RSET\r\n");
    print fgets($f,1024);
    fputs($f,"QUIT\r\n");
}
//Узнаю количество сообщений
function stat_message($f)
{
    fputs($f,"STAT\r\n");
    print fgets($f,1024);
}

//Узнаю вес каждого сообщения
function list_message($f)
{
    fputs($f,"LIST\r\n");
    print get_data($f);
}

//Выбор сообщения по номеру
function retr_message($f, $number_message){
    fputs($f,"RETR $number_message\r\n");
    //print get_data($f);  // Просмотр его без обробки информации
}


?>

Последний раз редактировалось YARK0S; 11.07.2017 в 23:33.
YARK0S вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[С++ Билдер]: Подсчитать общее количество предложений в заданном тексте. Леха Нек Помощь студентам 1 05.12.2016 22:08
Определение количества слов и предложений в тексте в C# AlexQQ Помощь студентам 1 08.05.2013 17:14
Статистика предложений в тексте Nik!ta Общие вопросы Delphi 1 09.05.2012 17:14
Поиск предложений (C#) Dimfn Помощь студентам 0 30.05.2010 16:21
Количество предложений в тексте Noxil Паскаль, Turbo Pascal, PascalABC.NET 7 25.12.2008 17:55