Сценарий поиска php mysql, как сделать отдельные слова, выделенные жирным шрифтом, если поисковый термин не точно соответствует записи в моей базе данных - PullRequest
0 голосов
/ 06 сентября 2011

Ниже мой сценарий до сих пор.Это отображает пользовательский термин поиска, выделенный жирным шрифтом, если это точное совпадение.Например.если пользователь будет искать "john bloggs", он будет выделен жирным шрифтом.тогда как если бы пользователь искал "john", то он бы показал запись в блоге john, но это не было бы жирным шрифтомЛюбая помощь будет принята с благодарностью.

<?
mysql_connect ("localhost", "user","pass")  or die (mysql_error());
mysql_select_db ("databasename");

$term = $_POST['term'];

$sql = mysql_query("select * from tablename where category like '%$term%' or title like '%$term%' or postcode like '%$term%' or info like '%$term%' ");

while ($row = mysql_fetch_array($sql)){

    echo '<br/> Category: '.str_replace($term,'<b>'.$term.'</b>',$row['category']);
    echo '<br/> Title:    '.str_replace($term,'<b>'.$term.'</b>',$row['title']);
    echo '<br/> Address:  '.$row['add1'];
    echo '<br/> Street:   '.$row['street'];
    echo '<br/> City:     '.$row['city'];
    echo '<br/> Postcode: '.str_replace($term,'<b>'.$term.'</b>',$row['postcode']);
    echo '<br/> Phone:    '.$row['phone'];
    echo '<br/> E-Mail:   '.$row['email'];
    echo '<br/> Website:  '.$row['website'];
    echo '<br/><br/>';

}
?>

Ответы [ 4 ]

2 голосов
/ 06 сентября 2011

Я использую следующее:

/**
 * higlights search string with HTML5-mark
 *
 * @param string needle search string
 * @param string haystack original text, may contain search string
 * @return string original text with additional HTML-mark highlighting
 */
function highlight($needle, $haystack)
{
    return preg_replace('/(' . preg_quote($needle, '/') . ')/i', '<mark>$1</mark>', $haystack);
}

Использование:

echo '<br/> Category: ' . highlight($term, $row['category']);
0 голосов
/ 06 сентября 2011

Полагаю, проблема, с которой вы сталкиваетесь, это% term% вещь. В базе данных он будет искать любую совпадающую позицию, в которой находится термин. Поэтому, если вы попытаетесь сделать строку вместо «foo bar», она будет искать только соответствующую строку «foo bar», а не «foo» или «bar».

Вы можете сделать следующее while ($ row = mysql_fetch_array ($ sql)) { $ term = explode ("", $ term); foreach ($ term как $ wordToReplace) { $ category = str_replace ($ wordToReplace, '<b>'. $ wordToReplace. '</b>', $ row ['category']); $ title = str_replace ($ wordToReplace, '<b>'. $ wordToReplace. '</b>', $ row ['title']); $ postCode = str_replace ($ wordToReplace, '<b>'. $ wordToReplace. '</b>', $ row ['postcode']); } // а затем показать echo '
Category:'. $ category; echo '
Title:'. $ title; echo '
Адрес:'. $ row ['add1']; echo '
Street:'. $ row ['street']; echo '
Город:'. $ row ['city']; echo '
Почтовый индекс:'. $ postCode; echo '
Phone:'. $ row ['phone']; echo '
E-Mail:'. $ row ['email']; echo '
Веб-сайт:'. $ row ['website']; }

ПРИМЕЧАНИЕ. Этот код не был протестирован!

0 голосов
/ 06 сентября 2011

Если вы просто ищете что-то быстрое и функциональное, у вас должно быть все в порядке. Если вы хотите немного улучшить его, вы можете использовать стили вместо тега <b> и использовать PHP strcasecmp () function

Например:

$field = (strcasecmp($term, $row['foo'])==0) ? "<span class='bold'>".$row['foo']."</span>" : $row['foo'];
0 голосов
/ 06 сентября 2011

Попробуйте это:

echo '<br/> Category: '.($term == row['category'] ? '<b>'.$term.'</b>' : $row['category']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...