Reputation: 15
i have a system that outputs a film review, when it is outputted i want the keywords that appear in it from 2 tables - negative and positive to be in a different colour any idea to do this ? The code is below
<?php
// Connect to database
mysql_connect("sdd", "sdsd", "") or die(mysql_error());
mysql_select_db("sdsd") or die(mysql_error());
$id = mysql_real_escape_string($_POST['reviewid']);
//$query = "select * from review where id = '$id'";
$query = mysql_fetch_assoc(mysql_query("SELECT filmreview FROM review WHERE id = '$id'"));
$pos = mysql_query("SELECT word FROM positive");
$neg = mysql_query("SELECT word FROM negative");
//Variables
$review_text = $query['filmreview'];
$good = 0;
$bad = 0;
// Gets words in to a text array and converts to lower case
$cnt_r = array_count_values(array_map('mb_strtolower',str_word_count($review_text, 1)));
// Gets the positive words and check for the word in the text
while($check = mysql_fetch_assoc($pos)){
$lower = mb_strtolower($check['word']);
if(isset($cnt_r[$lower])){
$good+= $cnt_r[$lower];
echo $check ['word'];
echo "<p>";
}
}
// Gets the negative words and check for the word in the text
while($check = mysql_fetch_assoc($neg)){
$lower = mb_strtolower($check['word']);
if(isset($cnt_r[$lower])){
$bad+= $cnt_r[$lower];
echo $check ['word'];
echo "<p>";
}
}
// If there are more positive words than negative than the review is positive
if ($good > $bad)
{
echo "<p>";
echo "This is a positive review";
echo "<p>";
}
// If there are more negative words than positive than the review is negative
else if ($good < $bad)
{
echo "<p>";
echo "This is a negative review";
echo "<p>";
}
// If there are the same amount of positive and negative words than the review is average
else if ($good == $bad)
{
echo "<p>";
echo "This is an average review";
echo "<p>";
}
//Prints out the number of postive and negative words found
echo "Good words: " . $good . " and Bad words: " . $bad;
echo "<p>";
echo $query ['filmreview'];
echo "<p>";
echo "This is <font color=\"blue\">blue</font>!";
echo "<form method='post' action='welcome.html'>";
echo "<input type='submit' name='searchagain' value='Search'>";
?>
Upvotes: 0
Views: 274
Reputation: 13557
$cnt_r = array_count_values(array_map('mb_strtolower',str_word_count($review_text, 1)));
seems to be a fraked up version of $cnt_r = str_word_count(mb_strtolower($review_text), 2);
preg_match_all('#[\w\pL]+#u', $review_text, $matches);
as the base of a UTF-8 version of str_word_count().<font>
tag! use CSS instead!<?php
$query = mysql_fetch_assoc(mysql_query("SELECT filmreview FROM review WHERE id = '$id'"));
$review_text = $query['filmreview'];
// Gets words in to a text array and converts to lower case
$review_words = array_count_values(array_map('mb_strtolower',str_word_count($review_text, 1)));
$positive_words = array();
$negative_words = array();
$positive_words_count = 0;
$negative_words_count = 0;
// Gets the positive words and check for the word in the text
$res = mysql_query("SELECT word FROM positive");
while ($row = mysql_fetch_assoc($res)){
// why isn't this already stored lower-case in database?
$_word = mb_strtolower($row['word']);
if (isset($review_words[$_word])){
$positive_words_count += $review_words[$_word];
$positive_words[] = $_word;
}
}
// Gets the negative words and check for the word in the text
$res = mysql_query("SELECT word FROM negative");
while ($row = mysql_fetch_assoc($res)){
// why isn't this already stored lower-case in database?
$_word = mb_strtolower($row['word']);
if (isset($review_words[$_word])){
$negative_words_count += $review_words[$_word];
$negative_words[] = $_word;
}
}
if ($positive_words_count > $negative_words_count) {
// If there are more positive words than negative than the review is positive
echo "<p>This is a positive review<p>";
} elseif ($positive_words_count < $negative_words_count) {
// If there are more negative words than positive than the review is negative
echo "<p>This is a negative review<p>";
} else {
// If there are the same amount of positive and negative words than the review is average
echo "<p>This is an average review<p>";
}
// highlight positive/negative words
$review_text = htmlspecialchars($review_text);
$pattern = '#\b(' . join('|', $positive_words) . ')\b#i';
$review_text = preg_replace($pattern, "<span class=\"positive\"\\1</span>", $review_text);
$pattern = '#\b(' . join('|', $negative_words) . ')\b#i';
$review_text = preg_replace($pattern, "<span class=\"negative\"\\1</span>", $review_text);
//Prints out the number of postive and negative words found
echo "Good words: " . $positive_words_count . " and Bad words: " . $negative_words_count;
echo "<p>" . $review_text . "<p>";
echo "This is <font color=\"blue\">blue</font>!";
and somewhere in your CSS define what span.negative
and span.positive
should look like.
Upvotes: -1
Reputation: 796
You could use CSS classes.
In your stylesheet or in a style tag within you page you could create the css classes:
p .negative { color: red; }
p .positive { color: black; }
Now just add the class to your paragraph and it would apply the styles you want.
// If there are more positive words than negative than the review is positive
if ($good > $bad)
{
echo '<p class="positive">';
echo 'This is a positive review';
echo '</p>';
}
// If there are more negative words than positive than the review is negative
else if ($good < $bad)
{
echo '<p class="negative">';
echo 'This is a negative review';
echo '</p>';
}
etc.....
Upvotes: 2
Reputation: 1814
Just search and find your keywords in the text and then just replace them. So roughly
if($postivekeyword) {
$newpostivekeyword = '<span class="positive">'.$postivekeyword.'</span>';
}
if($negativekeyword) {
$newnegativekeyword = '<span class="negative">'.$negativekeyword.'</span>';
}
Then just
$new_review_text = str_replace($postivekeyword, $newpostivekeyword, $review_text);
Upvotes: 0