这段 php 代码如何优化?

2015-03-02 18:02:40 +08:00
 EXDestroyer

初学php不久,一道题目,个人的做法是吧这些标题分别存到不同的数组,然后针对不同的数组进行循环遍历分别+=. 不过别人说这样还不如原来的,所以想请教下正确的方法是什么

$xcount=0;
     $pos = strpos($newtitle, '賣腎');
 if($pos) $xcount+=3;
     $pos = strpos($newtitle, '卖肾');
 if($pos) $xcount+=3;
     $pos = strpos($newtitle, '收肾');
 if($pos) $xcount+=3;
     $pos = strpos($newtitle, '24小时');
 if($pos) $xcount+=3;//24小时
     $pos = strpos($newtitle, '咨询热线');
 if($pos) $xcount+=3;//24小时
     $pos = strpos($newtitle, '找小姐');
 if($pos) $xcount+=6;//24小时
     $pos = strpos($newtitle, '服务信息');
 if($pos) $xcount+=6;//24小时
     $pos = strpos($newtitle, '学生妹');
 if($pos) $xcount+=6;//24小时
     $pos = strpos($newtitle, '找小姐');
 if($pos) $xcount+=6;//24小时

//

$pos = strpos($newtitle, '男女公关');
if($pos) { echo 'Fail, No Uid.';exit;}
     $pos = strpos($newtitle, '女公关');
if($pos) { echo 'Fail, No Uid.';exit;}
     $pos = strpos($newtitle, '男公关');
if($pos) { echo 'Fail, No Uid.';exit;}
     $pos = strpos($newtitle, '公关');
if($pos) { echo 'Fail, No Uid.';exit;}
     $pos = strpos($newtitle, '招聘');
4201 次点击
所在节点    PHP
24 条回复
nigelvon
2015-03-02 18:07:19 +08:00
循环遍历为啥不如原来的,同样的代码重复N遍很爽么。
lijinma
2015-03-02 18:09:46 +08:00
原题目是啥?
EXDestroyer
2015-03-02 18:10:29 +08:00
@nigelvon 对方的说法是,逻辑上没有原来的好,看上去不好维护
我是把+=+,+=3,以及fail的三部分分开存到三个数组,对他们分别进行遍历
EXDestroyer
2015-03-02 18:11:24 +08:00
@lijinma http://d1kt.cn/course/pluginfile.php?file=/5031/mod_assign/intro/ssw.php
修改这段代码,使程序结构更漂亮更好维护一点
invite
2015-03-02 18:18:05 +08:00
不是应该: {key:value} 么?
raincious
2015-03-02 18:25:34 +08:00
能将原题贴上来么?

这代码写的不好。不知道你什么意图,如果是搜索字符串是否存在,那么if($pos)这样的用法就是错的。
branchzero
2015-03-02 18:30:10 +08:00
猜测应该是违禁词屏蔽?
<?php
$words = ['賣腎','关键词太多了自己后面接着加'];
foreach($words as $word){
if(strpos($newtitle, $word)) exit('Fail, No Uid.');
}
?>
搞定
Moker
2015-03-02 18:32:36 +08:00
话说那些关键词 没人注意到么
jswh
2015-03-02 18:35:28 +08:00
如果我写的话估计是这样子的

$config = [
'xCountPlus3' => [],
'xCountPlus6' => [],
'NoUidAndExit' => [],
];
$xCount = 0;
foreach($config as $action => $keywords) {
foreach($keywords as $word) {
if(strpos($newTitle, $word) !== false) {
$action($xCount);
}
}
}
function xCountPlus3(&$xCount) {
$xCount += 3;
}
function xCountPlus6(&$xCount) {

}
...
b821025551b
2015-03-02 18:36:20 +08:00
7L正解
hwiiago
2015-03-02 18:37:41 +08:00
$sensitiveWords = array('賣腎' => 3, '卖肾' => 3, '收肾' => 3, '找小姐' => 6);
$xcount = 0;
foreach($sensitiveWords as $key => $value)
{
if (strpos($newtitle, $key) !== false)
{
$xcount += $value;
}
}
zhujinliang
2015-03-02 18:40:03 +08:00
我的话会用正则搞,让正则处理器自己去优化
jk2r
2015-03-02 18:47:40 +08:00
和敏感词过滤类似呀。

你需要一个“多模式匹配”的PHP实现(AC状态机/Double-array Trie树),查出有的词;
然后k-v查分数吧
qqjt
2015-03-02 19:03:55 +08:00
只有我好奇这个是用在哪里的么,又是找小姐又是学生妹……
EXDestroyer
2015-03-02 19:06:07 +08:00
@raincious 原题在4楼了
msg7086
2015-03-02 19:48:08 +08:00
if pos 什么鬼
br00k
2015-03-02 20:55:04 +08:00
是我应该会这样吧,感觉这种还是用数组方便,就是title也是数组for嵌套,也比单纯if好,不然数组内容多了,会增加太多无用代码。

$title = "xxx";
$str = ["賣腎", "卖肾", "收肾", "24小时", "咨询热线", "找小姐", "服务信息"];
foreach ($str as $value) {
if (false !== strpos($title, $value)) {
echo $value;
exit;
}
}
alex321
2015-03-02 21:23:22 +08:00
$str = array('賣腎', '卖肾', '收肾', '24小时', '咨询热线', '找小姐', '服务信息','男女公关','男公关','女公关','公关','招聘');
preg_match('('.implode($str, '|').')', $newtitle, $matches);
return strlen(implode($matches, ''));
Jaylee
2015-03-02 21:29:16 +08:00
表驱动法
jookr
2015-03-02 23:24:29 +08:00
以前我弄个采集QQ空间的网站也用到这个违禁词遍历,出现则该页面不显示。
IDC先拔线再QQ通知我整改,然后续费的时候不租给我了,网站没这么赚钱就关了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/173994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX