Я выполняю полнотекстовый поиск по моим "страницам" в таблице MySQL. Я отображаю список страниц, которые соответствуют ключевому слову в их «заголовке» (обычный текст, VARCHAR, 255) или «контенте» (html, TEXT). Когда совпадение найдено в поле «содержимое», я хотел бы отобразить фрагмент, в котором совпадение было найдено. Я понятия не имею, как это сделать.
Можете ли вы поставить меня в правильном направлении?
$query = ' SELECT
*,
MATCH(title, content) AGAINST("'.$keyword.'") AS score
FROM
page
WHERE
MATCH(title, content) AGAINST("'.$keyword.'")
ORDER BY
score
DESC ';
$result = mysql_query($query) or die (mysql_error());
if(mysql_num_rows($result) > 0) {
$output .= '<p>Your keyword matches the following pages:</p>';
while($row = mysql_fetch_assoc($result)){
$title = htmlentities($row['title']);
$content = htmlentities(strip_tags($row['content']));
$content = limit_text($content, 250); // Cuts it down to 250 characters plus ...
$output .= '<h2>'.$title.'</h2>';
if(trim($content) != '') {
$output .= '<p>'.$content.'</p>'; // I'd like to place a snippet here with the matched context
}
}
} else {
$output .= '<p>Keyword not found...</p>';
}
Кроме того, у меня есть вопрос относительно безопасности. Сейчас я проверяю $keyword
тремя способами:
- Не пусто?
- Более 2 символов?
- Не опасно? (см. ниже)
Я использую регулярное выражение, чтобы соответствовать следующему, чтобы увидеть, опасен ли ввод пользователя
<script|<script|>script|document.|alert|bcc:|cc:|x-mailer:|to:|recipient|truncate|drop table
Это может быть немного нелепо и легко обойти, но это как минимум минимальная форма защиты от XSS-эксплойтов. Каков рекомендуемый способ обезопасить ключевое слово, предназначенное для поиска? PHPIDS перебор?