2011-10-31 7 views
0

私のテキスト内の最初の検索キーワードの前後に次のコードを使用しています(これは検索ページ用です)。切り捨ての先頭で半分になると、切り詰めの最後にある単語は切り取られません。テキスト内の検索キーワードの前に内容を切り捨てます。

例:

lients at the centre of the relationship and to offer a first class service to them, which includes tax planning, investment management and estate planning. We believe that our customer focused and... 

(編集:それは時々単語から欠落している複数の文字である)

あなたはそれが顧客のオフcをみじん切りしていることがわかります。終わりではなくテキストの冒頭でのみ起こります。これをどうすれば解決できますか?私は半分そこにいると信じています。これまでコード:

function neatest_trim($content, $chars, $searchquery,$characters_before,$characters_after) { 
      if (strlen($content) > $chars) { 
       $pos = strpos($content, $searchquery); 
       $start = $characters_before < $pos ? $pos - $characters_before : 0; 
       $len = $pos + strlen($searchquery) + $characters_after - $start; 
       $content = str_replace('&nbsp;', ' ', $content); 
       $content = str_replace("\n", '', $content); 
       $content = strip_tags(trim($content)); 
       $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, $start, $len)); 
       $content = trim($content) . '...'; 
       $content = strip_tags($content); 
       $content = str_ireplace($searchquery, '<span class="highlight" style="background: #E6E6E6;">' . $searchquery . '</span>', $content); 
      } 
      return $content; 
     } 



$results[] = Array(
    'text' => neatest_trim($row->content,200,$searchquery,120,80) 
      ); 
+0

コンテンツの先頭には常に1文字だけありますか? –

+0

必ずしもそうではありません。ときどき1つ以上 – hairynuggets

+0

私は、あなたは基本的に検索キーワードの後に​​120文字、80文字を残していると思う? –

答えて

0

あなたは120番目の文字がスペースまたは文字である、とだけどんなそこに文字列をカットしていないかどうかをチェックしません開始時に維持されている120の文字。

私は、開始位置から最も近い「スペース」を検索するためにこの変更を行います。

$start = $characters_before < $pos ? $pos - $characters_before : 0; 
// add this line: 
$start = strpos($content, ' ', $start); 
$len = $pos + strlen($searchquery) + $characters_after - $start; 

この方法$startは、スペースの位置ではなく、単語からの手紙です。

あなたの機能になるだろう:

function neatest_trim($content, $chars, $searchquery,$characters_before,$characters_after) { 
    if (strlen($content) > $chars) { 
    $pos = strpos($content, $searchquery); 
    $start = $characters_before < $pos ? $pos - $characters_before : 0; 
    $start = strpos($content, " ", $start); 
    $len = $pos + strlen($searchquery) + $characters_after - $start; 
    $content = str_replace('&nbsp;', ' ', $content); 
    $content = str_replace("\n", '', $content); 
    $content = strip_tags(trim($content)); 
    $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, $start, $len)); 
    $content = trim($content) . '...'; 
    $content = strip_tags($content); 
    $content = str_ireplace($searchquery, '<span class="highlight" style="background: #E6E6E6;">' . $searchquery . '</span>', $content); 
    } 
    return $content; 
    } 
+0

私はまだ多かれ少なかれ同じことをしています。他のアイデア、私の髪を引き出します。 haha – hairynuggets

+0

コンテンツの先頭から切り捨てる必要がない限り、これはうまくいくはずです。ローカルでテストしましたが、開始時に単語を切り捨てることはありません... –

+0

一部のテキストとほとんど同じです。たとえば、 'sing profile' UK 'は、「上昇プロファイル」の考えですか? – hairynuggets

0

だけ置き換える正規表現を使用していないのはなぜ?

$result = preg_replace('/.*(.{10}\bword\b.{10}).*/s', '$1', $subject); 

だから、これはキーワード「単語」

説明する前と後のすべての10個の文字をトリムします:

# .*(.{10}\bword\b.{10}).* 
# 
# Options: dot matches newline 
# 
# Match any single character «.*» 
# Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
# Match the regular expression below and capture its match into backreference number 1 «(.{10}\bword\b.{10})» 
# Match any single character «.{10}» 
#  Exactly 10 times «{10}» 
# Assert position at a word boundary «\b» 
# Match the characters “word” literally «word» 
# Assert position at a word boundary «\b» 
# Match any single character «.{10}» 
#  Exactly 10 times «{10}» 
# Match any single character «.*» 
# Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 

それでは、この正規表現はありませんが、あなたの単語を見つけることです(それは\ b - wordの境界に含まれているので、その単語だけを指定する)、単語の前の10文字と10文字のantストア(単語を含む)それの後に咬合する。あなたは、前の文字のための変数ともちろんキーワードを使って、正規表現を自分で作ることができます。正規表現は他のすべてにもマッチしますが、置き換えは出力として必要な逆参照$ 1のみを使用します。

+0

あなたはどのようなbword、$ 1、被験者であるか説明できますか。 – hairynuggets

+0

どのように変数を入れようとしていますか? – hairynuggets

+0

$ regex = ""。$変数。 "<より多くのものを一致させる>"; preg_match($ regex、$ string、$ regs); ; – FailedDev

関連する問題