Разделите строку пополам, не обрезая элемент - PullRequest
0 голосов
/ 28 февраля 2012

Я пытаюсь взять строку и обрезать ее в определенный момент (в основном, для предварительного просмотра выделенного текста), но внутри могут быть изображения или похожий контент (для этого используется BBCode), и мне было интересно,в PHP был простой способ сделать это.

Пример:

$content = "blah blah blah such and such [img]imagehere[/img] blah blah";
$preview=unknownfunction($content); //cuts off at approx. 40 chars
//do not want this:
$preview="blah blah blah such and such [img]image";//this is bad because half of image is gone
//want this:
$preview="blah blah blah such and such [img]imagehere[/img]"; //this is good because even though it reached 40 chars, it let it finish the image.

Есть ли простой способ сделать это?Или, по крайней мере, я мог бы удалить все теги из элемента предварительного просмотра, но я все же хотел бы, чтобы эта функция не обрезала слова.

Ответы [ 4 ]

1 голос
/ 28 февраля 2012

Вот функция, которая использует регулярное выражение

<?php 
function neat_trim($str, $n, $delim='') {
    $len = strlen($str);
    if ($len > $n) {
        preg_match('/(.{'.$n.'}.*? )\b/', $str, $matches);
        return @rtrim($matches[1]) . $delim;
    }else {
        return $str;
    }
}


$content = "blah blah blah such and such [img]imagehere[/img] blah blah";
echo neat_trim($content, 40);
//blah blah blah such and such [img]imagehere[/img] 
?>
1 голос
/ 28 февраля 2012

Ваша проблема в том, что вам нужно придумать некоторые правила. Если строка

$str = '[img]..[img] some text here... ';

Тогда вы проигнорируете изображение и просто извлечете текст? Если это так, вы можете использовать некоторые регулярные выражения, чтобы убрать весь BB-код из копии строки. Но тогда он будет рассматривать текст с обеих сторон в экземпляре, таком как

$str = 'txt txt [img]....[/img] txtxtxt ; // will become $copystr = 'txttxt  txttxttxt';

Вы можете получить 'маркер' со строками первого вхождения '[', '[img]' или массивом элементов, которые вы не хотите разрешать. Затем прокрутите их, и если они меньше желаемой длины «предварительного просмотра», то используйте эту позицию ++ в качестве вашей длины.

<?php
function str_preview($str,$len){
   $occ = strpos('[',$str);
   $occ = ($occ > 40) ? 40 : $occ;
   return substr($str,0,++$occ);
}
?>

что-то подобное сработало бы, если вы хотите подняться до первого '['. Если вы хотите игнорировать [B] (или другие) и разрешить их применение, тогда вы захотите написать более сложный шаблон фильтрации, который позволяет это. Или - если вы хотите убедиться, что он не обрезается в середине слова, вы должны рассмотреть strpos ('' ..), используя смещение, чтобы изменить длину так, как вам нужно. Не будет волшебного 1 вкладыша, чтобы справиться с этим.

1 голос
/ 28 февраля 2012

проверить это:

$ php -a

php > $maxLen = 5;
php > $x = 'blah blah blah such and such [img]imagehere[/img] blah blah';
php > echo substr(preg_replace("/\[\w+\].*/", "", $x), 0, $maxLen);
blah 
0 голосов
/ 28 февраля 2012

Одно решение, которое я нашел, было следующее

<?php
    function getIntro($content)
    {
        if(strlen($content) > 350)
        {
            $rough_short_par = substr($content, 0, 350); //chop it off at 350
            $last_space_pos = strrpos($rough_short_par, " "); //search from end: http://uk.php.net/manual/en/function.strrpos.php
            $clean_short_par = substr($rough_short_par, 0, $last_space_pos);
            $clean_sentence = $clean_short_par . "...";
            return $clean_sentence; 
        }
        else
        {
            return $content;
        }
    }
?>

Это работает, чтобы предотвратить обрезание слов, но все равно может обрезать теги. Для этого я могу запретить размещение изображений в тексте предварительного просмотра и отобразить изображение предварительного просмотра, которое я уже сохранил. Это предотвратит обрезание изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...