2012-02-28 32 views
0

文字列を取り出して特定の点で切り取ろうとしています(基本的には選択したテキストのプレビューを提供します)が、画像や類似の内容がこのために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. 

これを行う簡単な方法はありますか?または、少なくとも、プレビュー要素からすべてのタグを削除することはできますが、この機能を使用して単語を切り捨てないようにしたいと思います。このうち

+0

最初に「bbcoded」のコンテンツを削除し、残りの単語を数えて分割します(たとえば、前回チェックしたときのMyBBフォーラムなど) –

+0

これは頻繁に回答しているような気がします。 http://stackoverflow.com/a/9202571/383402とその他の回答があります。 – Borealid

+0

BBタグのリストを取得できる場合は、preg_match_allを使用して文字列を分割し、その後で計算を行うことができます。さもなければ '[' '] '文字を使って正規表現を使うことができますが、認識できないタグをどのように解析するのか分かりません。 – inhan

答えて

1

は、相続人の正規表現

<?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] 
?> 
+0

なんらかの理由でこれは何のテキストも示していませんでした。しかし、私はそれが働くことを終了するかどうかを確認するために、それを続けるつもりです。 – muttley91

1

チェック:

$ 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 
1

を使用する関数は、あなたが持っているだろう問題は、いくつかのルールを考え出す必要があるということです。文字列が

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

の場合は、イメージを無視してテキストを抽出しますか?もしそうなら、いくつかの正規表現を使用して、文字列のコピーからすべてのBBコードを削除することができます。しかし、それはあなたが「[」、「[IMG]」の最初の出現のstrposと「マーカー」、またはの配列を取得することができ、そのような

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

としてインスタンスの両側にテキストを検討しますあなたが許可したくない要素。それらを繰り返し、希望の「プレビュー」の長さよりも短い場合は、その位置を長さとして++を使用します。

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

最初の '['に移動したい場合は、そのように動作します。 [B](または他のもの)を無視してそれらを適用できるようにするには、それを可能にするより複雑なフィルタリングパターンを書いてください。または、単語の途中で途切れることがないようにするには、必要な長さを変更するためにオフセットを使用してstrpos( '..)を考慮する必要があります。それを処理するための魔法の1本のライナーはありません。私が見つけた

0

一つの解決策は、それは言葉を切断防ぐために動作しますが、それはまだタグを切断可能性があり、次の

<?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; 
     } 
    } 
?> 

ました。これを行うには、画像がプレビューテキストに投稿されないようにして、既に保存してあるプレビュー画像を表示させます。これにより、画像がカットされなくなります。

関連する問題