首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用strpos查找链接中的单词

问如何使用strpos查找链接中的单词
EN

Stack Overflow用户
提问于 2012-05-22 20:36:30
回答 4查看 467关注 0票数 1

我将创建数据库表badwords来存储一些不需要的单词id,word,如下所示。

代码语言:javascript
复制
CREATE TABLE `badwords`(
`id` int(3) NOT NULL auto_increment,
`word` text,
PRIMARY KEY (`id`),
KEY `id` (`id`))

假设我存储了以下单词

代码语言:javascript
复制
(1,ugly)
(2,yak)

现在我的访问者可能会发布一些包含其中一个不好的词的链接,我愿意使用这样的东西。

代码语言:javascript
复制
$user = "http://www.this_ugly_site.com"; // visitor post this (ugly) word within

// i'm gonna try to find any of bad words stored in my table

$qry="select * from badwords where word='$user'"; // how to do it (find)
$result=mysql_query($qry) or die($qry);
if(mysql_num_rows($result)=='0'){

echo "Good URL";

}else{

while($line=mysql_fetch_array($result)){

echo "Bad URL";

}}

我不知道如何应用strpos,如果它真的很好的解决方案或有其他东西,我可以使用!

或者我可以使用

代码语言:javascript
复制
$qry="select * from badwords where word LIKE '%$user%'";

但是它看起来并不安全,因为它将用户提供的值嵌入到您的SQL中

所以有什么想法或者帮助怎么做~谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-22 20:48:18

你已经问了3个独立的问题:

  1. How我要使用 strpos()吗

它是一个原生PHP函数,有三个参数。我鼓励您使用和学习PHP Docs。尽管如此,这里有一个例子:

$bad_word);

  • Is ($string,strpos还有更好的方法吗?

很有可能。但你所拥有的并不是坏事。strpos()是较快的字符串函数之一。如果每秒有数以千计的坏词和大量请求,那么您可能希望缓存这些坏词,而不是每次都查询MySQL。但是,不需要过早地进行优化。就目前而言,请及早失败。也就是说,当你发现一个不好的词时,你会转义MySQL中的字符串吗?

我建议您先使用MySQLi扩展,然后使用mysqli->real_escape_string()。

例如:

$qry = "SELECT * FROM badwords WHERE单词如‘%’。$dbc->real_escape_string($user)。"%'";

票数 2
EN

Stack Overflow用户

发布于 2012-05-22 20:52:50

如果你坚持做这样的事情,我会让MySQL为你做所有的工作。您需要做的是将操作数的顺序颠倒到您可能习惯于在LIKE子句中使用它们的方式:

代码语言:javascript
复制
SELECT `word`
FROM `badwords`
WHERE '<user_input>' LIKE concat('%', `word`, '%')
LIMIT 1

基本的PHP代码如下所示:

代码语言:javascript
复制
// User input
$user = "http://www.this_ugly_site.com";

// Find matching words
// Do NOT show mysql_error() or $query in a production environment!
$query = "
  SELECT `word`
  FROM `badwords`
  WHERE '".mysql_real_escape_string($user)."' LIKE concat('%', `word`,'%')
  LIMIT 1
";
$result = mysql_query($query) or die("MySQL Error: ".mysql_error()."\n".$query);

// Test for a match
if (mysql_num_rows($result)) {
  $row = mysql_fetch_assoc($result);
  echo "Bad URL (matches {$row['word']})";
} else {
  echo "Good URL";
}
票数 3
EN

Stack Overflow用户

发布于 2012-05-22 20:42:24

您正在向后搜索字符串。我不确定我是否会使用MySQL来做这件事;相反,我可能会从表中取出所有不好的单词,并搜索我的字符串,如下所示:

代码语言:javascript
复制
<?
$user_string = "http://www.this_ugly_site.com";

$query = "SELECT word FROM badwords";
$res = mysql_query($query);

$stringOkay = true;

while ($row = mysql_fetch_assoc($res))
{
    //use stripos for case insensitive matching
    if (stripos($user_string, $row['word']) !== false)
    {
        //this user string contains a bad word!
        $stringOkay = false;
        break;
    }
}

if ($stringOkay) echo "Good URL";
else echo "Bad URL";

正如DaveRandom在您的操作中所评论的那样,使用这种搜索方法,您将得出许多误报和漏报。一种稍微好一点的方法是使用正则表达式,但即使是正则表达式也不能证明是愚蠢的。

例如,您可能想要阻止单词'yak‘机器人而不是'kayak’,因此,您可以使用带有单词分隔符(\b)的正则表达式,并且您可以使用如下表达式:#(^|\b)yak(\b|$)#i,这也为您提供了阻止像"ass“这样的东西,当拼写为"leet speak”时,使用像这样的#a(55|$$)#i模式,但同样,这可能会导致漏报,因为有人可能输入a5$或a**。基本上,这是一个“难题”,你需要一个更复杂的解决方案来获得完整的覆盖/保护。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10702169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档