2011-10-30 17 views
0

私はpreg_replaceを使用して自分のサイトで検索されたコンテンツのスニペットを作成し、(Googleのように)検索された用語を強調表示しています。それは私のページで静的変数を使用するときに動作しますが、データベースからデータを取得する際には使用しません。コードは以下の通りである:Preg_replace動的コンテンツ?

foreach ($searchcontent ->result() as $row) 
{ 
$text = $row->content; 
$keyword = 'investment'; 
$size = 165; 

$snippet = preg_replace(
    '/^.*?\s(.{0,'.$size.'})(\b'.$keyword.'\b)(.{0,'.$size.'})\s.*?$/', 
    '...$1<strong>$2</strong>$3...', 
    $text 
); 
echo $snippet; 

    } 

私はのようないくつかの静的コンテンツの変数$ textの内容に変更した場合: "We are happy to consultant on your investments"それが動作します。しかし、私はdbからデータを取得しません。

データベースからテキストのサンプル(HTMLが含まれている、問題になる場合があります)、

<h2>Investments<h2> 
<hr /> 
<p>We are happy to consult on your investments</p> 

はどのようにしてhtmlタグの文字列を剥ぎ取りに行きますか? preg_replaceが動作していますか?

+0

もちろんこれが問題です。 dbは毎回同じHTMLを返しますか?それともそれは変わるのだろうか? – FailedDev

+0

多かれ少なかれ同じフォーマットですが、変化する可能性があります – hairynuggets

+1

普通のhtmlを扱っている限り、 'str_replace()'で十分でしょう。とにかく、言及された「正規表現」の表現は、その主題と比較して過度に複雑に見えます。 – yoda

答えて

1

これは動作します:あなたは、実際のデータベースの結果を貼り付けた場合に問題がある可能性がありますので、http://codepad.org/Ve1dhj8q

しかし、それは、良いだろう。

編集

これは、あなたが望むものです。 preg_match()を使用して($matches[1])の前と($matches[2])の後の内容をキャプチャし、一致するものが見つかったかどうかを確認することを忘れないでください(count()を使用)。単語を強調表示するために、前に投稿したコードを追加するだけです。 $limitはオフセットです。

$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent consectetur tempor egestas. Nam arcu augue, bibendum sed pulvinar at, posuere ut massa. Duis tristique suscipit rutrum. Curabitur eu est sed sem consequat consequat ut sed erat. Aliquam ac eros est. Nulla posuere dolor eu arcu tempus suscipit auctor velit condimentum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas sollicitudin diam ut neque laoreet vitae placerat tortor commodo. Aliquam vehicula aliquet arcu non molestie. Sed adipiscing faucibus faucibus. In eget velit non elit ullamcorper consequat.'; 

$limit = 50; 
$keyword = 'tempus'; 


preg_match('/(.{0,'.$limit.'})'.$keyword.'(.{0,'.$limit.'})/', $text, $matches); 

echo var_dump($matches); 

出力例

array(3) 
{ 
    [0]=> string(106) " Aliquam ac eros est. Nulla posuere dolor eu arcu tempus suscipit auctor velit condimentum. Class aptent t" 

    [1]=> string(50) " Aliquam ac eros est. Nulla posuere dolor eu arcu " 

    [2]=> string(50) " suscipit auctor velit condimentum. Class aptent t" 
} 

ボーナス

設計/マークアップのために、あなたはにフレーズを制限する必要がある場合は、ケース100個の単語(たとえば、あなたのdivを言うことができますコンテナはレイアウトのバランスを保つために一定の文字数しか使用できません)、これを行うことができます:

$limit = 0; 
$total = 100; 
$keyword = 'yumm'; 

$limit = (int) ($total - strlen($keyword))/2); 
+0

ダイナミックコンテンツの出力バッファリングが必要ですか? – hairynuggets

+0

その文脈にはありません。あなたはそれを使用することができます、それはあなたが達成しようとしているものに依存します。 – yoda

+0

貼り付けたコードを使用して、ハイライトされたキーワードの周りにエコーされる単語をどのように制限できますか?テキストが長いので、これは重要です。 – hairynuggets

0

PHPのstrip_tags()機能を使用できます。

$text = strip_tags($row->content); 
+0

こんにちはクライブ、私はタグのテキストを取り除いたが、preg_replaceはまだデータベースからのコンテンツに実行されません。何か案は??? – hairynuggets