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

Статус
В этой теме нельзя размещать новые ответы.

magicrobot

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

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

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

Покажу на примере: создаётся вот такой контент:
jAMAwusd.png

а вот это мы видим после работы скрипта:
jAMAwuse.png


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

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

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( $out, 0, $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 :)
 
ну собственно судя по всему вся магия тут

PHP:
 $out = str_replace( "1", '', $out );
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху