magicrobot
Профессор
- Регистрация
- 22 Сен 2013
- Сообщения
- 177
- Реакции
- 43
- Автор темы
- #1
Срузу скажу несколько вещей, чтобы стало понятно:
1) я совершенно не могу осилить регулярку, поэтому постоянно спрашиваю
2) этот код работает в wordpress, является частью темы, прописан в functions.php
В общем суть задачи такова:
В WP есть пост. При добавлении поста иногда авторы пишут Цитату. Иногда не пишут. Функция должна вернуть кусок поста либо до первой точки (как правило первое предложение в посте), либо текст до тега <!--more-->, либо Цитату к этому посту (эта функция обычно небходима для выводов аннотаций после заголовков в общем списке или при трансляциях в соцсети через rss).
Вышеописанный момент вроде бы работает, но обнаружился странный глюк. Если в первом предложении поста встречается единица - она странным образом исчезает.
Покажу на примере: создаётся вот такой контент:
а вот это мы видим после работы скрипта:
Как видим, единица "потерялась"
Теперь, собственно, сам скрипт:
какую то часть текста я понимаю конечно, но вразумить, где конкретно вычисляется этото момент с единицей, я пожалуй, не смогу. Одно понимаю, что это где то в функциях "preg_replace".
Помогите, plz
1) я совершенно не могу осилить регулярку, поэтому постоянно спрашиваю
2) этот код работает в wordpress, является частью темы, прописан в functions.php
В общем суть задачи такова:
В WP есть пост. При добавлении поста иногда авторы пишут Цитату. Иногда не пишут. Функция должна вернуть кусок поста либо до первой точки (как правило первое предложение в посте), либо текст до тега <!--more-->, либо Цитату к этому посту (эта функция обычно небходима для выводов аннотаций после заголовков в общем списке или при трансляциях в соцсети через rss).
Вышеописанный момент вроде бы работает, но обнаружился странный глюк. Если в первом предложении поста встречается единица - она странным образом исчезает.
Покажу на примере: создаётся вот такой контент:
а вот это мы видим после работы скрипта:
Как видим, единица "потерялась"
Теперь, собственно, сам скрипт:
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