После работы кода теряется единица...

Тема в разделе "Регулярные выражения", создана пользователем magicrobot, 26 июл 2014.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. magicrobot

    magicrobot Постоялец

    Регистр.:
    22 сен 2013
    Сообщения:
    110
    Симпатии:
    38
    Срузу скажу несколько вещей, чтобы стало понятно:
    1) я совершенно не могу осилить регулярку, поэтому постоянно спрашиваю
    2) этот код работает в wordpress, является частью темы, прописан в functions.php

    В общем суть задачи такова:
    В WP есть пост. При добавлении поста иногда авторы пишут Цитату. Иногда не пишут. Функция должна вернуть кусок поста либо до первой точки (как правило первое предложение в посте), либо текст до тега <!--more-->, либо Цитату к этому посту (эта функция обычно небходима для выводов аннотаций после заголовков в общем списке или при трансляциях в соцсети через rss).

    Вышеописанный момент вроде бы работает, но обнаружился странный глюк. Если в первом предложении поста встречается единица - она странным образом исчезает.

    Покажу на примере: создаётся вот такой контент:
    [​IMG]
    а вот это мы видим после работы скрипта:
    [​IMG]

    Как видим, единица "потерялась"

    Теперь, собственно, сам скрипт:

    PHP:
    /* Обрезка текста - excerpt
    maxchar = количество символов.
    text = какой текст обрезать (по умолчанию берется excerpt поста, если его нету, то content, если есть тег <!--more-->, то maxchar игнорируется и берется все, что до него, с сохранением HTML тегов )
    save_format = Сохранять перенос строк или нет. По умолчанию сохраняется. Если в параметр указать определенные теги, то они НЕ будут вырезаться из обрезанного текста (пример: save_format=<strong><a> )
    echo = выводить на экран или возвращать (return) для обработки.
    П.с. Шоткоды вырезаются. Минимальное значение maxchar может быть 22.
    */ 
    function kama_excerpt($args=''){ 
        global 
    $post
            
    parse_str($args$i); 
            
    $maxchar     = isset($i['maxchar']) ?  (int)trim($i['maxchar'])     : 350
            
    $text        = isset($i['text']) ?          trim($i['text'])        : ''
            
    $save_format = isset($i['save_format']) ?   trim($i['save_format'])         : false
            
    $echo        = isset($i['echo']) ?          false                   true
       
        
    // Если есть эксепт - сразу же его возвращаем целиком
        
    if($post->post_excerpt){
            return print 
    $post->post_excerpt;
        }
     
     
        if (!
    $text){ 
            
    $out $post->post_excerpt $post->post_excerpt $post->post_content
            
    $out preg_replace ("!\[/?.*\]!U"''$out ); //убираем шоткоды, например:[singlepic id=3] 
            // для тега <!--more--> 
            
    if( !$post->post_excerpt && strpos($post->post_content'<!--more-->') )
            { 
                
    preg_match ('/(.*)<!--more-->/s'$out$match); 
                
    $out str_replace("\r"''trim($match[1], "\n")); 
                
    $out preg_replace"!\n\n+!s""</p><p>"$out ); 
                
    $out "<p>"str_replace"\n""<br />"$out ) ."</p>"
                if (
    $echo
                    return print 
    $out
                return 
    $out
            } 
        } 
     
        
    $out $text.$out
        if (!
    $post->post_excerpt
            
    $out strip_tags($out$save_format); 
     
        if ( 
    iconv_strlen($out'utf-8') > $maxchar ){ 
            
    $out iconv_substr$out0$maxchar'utf-8' ); 
            
    $out preg_replace('@(.*)\s[^\s]*$@s''\\1 ...'$out); //убираем последнее слово, ибо оно в 99% случаев неполное 
        

     
        if(
    $save_format){ 
            
    $out str_replace"\r"''$out ); 
            
    $out preg_replace"!\n\n+!""</p><p>"$out ); 
            
    $out "<p>"str_replace "\n""<br />"trim($out) ) ."</p>"
        } 
       
        
    preg_match('~^[^\.]+\.~s'$out$match);  //До первой точки
        
    $out $match[0]; 
       
        
    $out str_replace"1"''$out ); 

     
        if(
    $echo) return print $out
        return 
    $out

    какую то часть текста я понимаю конечно, но вразумить, где конкретно вычисляется этото момент с единицей, я пожалуй, не смогу. Одно понимаю, что это где то в функциях "preg_replace".

    Помогите, plz :)
     
  2. warg

    warg Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    125
    Симпатии:
    137
    ну собственно судя по всему вся магия тут

    PHP:
     $out str_replace"1"''$out ); 
     
Статус темы:
Закрыта.