我正在尝试编写一个php函数来搜索引用页面中的术语,然后根据这些术语的存在执行一个函数。
创建基本代码不是问题,但是使用相当多的单词和可选操作,对于每组单词/函数,脚本使用单独的行会变得很长。基本代码概念如下。 stripos函数与首选项的顺序相反,因此如果出现两个或多个术语,那么最重要的术语是最后一个并且将超过之前的术语
(我想可能有一种方法可以在满足第一个条件后退出脚本,但我的退出实验失败了,所以我只使用反向排序)。
group1 = array("word1","word2","word3","word4","word5");
group2 = array("word6","word7","word8");
group3 ... etc
foreach($group1 as $groupa) { if(stripos($string, $groupa) !== false) { do something A; } }
foreach($group2 as $groupb) { if(stripos($string, $groupb) !== false) { do something B; } }
foreach ... etc
有没有办法使用二维数组或两个数组,一个是单词,一个是动作?即:
words = array("word1","word2","word3","word4","word5","word6","word7","word8")
actions = array("something A","something A","something A","something A","something A","something B","something B","something B")
foreach($words as $word) { if(stripos($string, $word) !== false) { do actions; } }
......更新......
受Phillips建议的启发,我们最终得到了一个多维数组,然后逐步完成了它的“行”。现在正致力于从MySQL中获取数组,而不是在代码中写出来。
$terms = array(
array( "word" => "word1",
"cat" => "dstn",
"value" => "XXXX"
),
..etc
..etc
);
foreach ($terms as $i => $row)
{ if(stripos($refstring3, $row['word']) !== false) { $$row['cat'] = $row['value']; } }
......更新......
它已演变为一个简单的MySQL查询,后跟一个while语句而不是foreach。由于反馈和Stackoverflow上的各种其他帖子,它就像一个魅力。
感谢所有人。
这个地方非常适合学习和理解,帖子直接跳到事物的内容,并且不必搜索大量相关但不适用的教程。
答案 0 :(得分:0)
您可以将单词操作存储为
形式的键值数组$actionsForWord = array("myAction" => "myword", "myAction2" => "myword2");
然后浏览这些并使用Eval和字符串连接来调用函数:http://php.net/manual/en/function.eval.php
但是,如果您告诉我们更多关于您实际想要实现的目标 - 例如,您希望采取哪些行动的例子,基于什么词? - 可能有更好,更清晰的方法来组织您的代码。请记住,Eval需要通过永不传递用户内容来保护,因此只能使用您自己的“白名单”命令。
答案 1 :(得分:0)
尽管Philipp Lenssen给出的答案肯定是正确的(并且已被接受)并且可行,但我真的不喜欢使用eval执行功能的想法。你可以试试这个;
<?php
function search( $content, $actions ) {
foreach( $actions as $action => $terms ) {
foreach( $terms as $term ) {
if( stripos( $content, $term ) !== false ) {
/* Match found, perform $action, and return. */
return $action( strtolower( $term ) );
}
}
}
return false;
}
function foo( $term ) {
return "foo(): Found the term '{$term}'.";
}
function bar( $term ) {
return "bar(): Found the term '{$term}'.";
}
$tests = array(
'This is text containing term 1' => "foo(): Found the term 'term 1'.",
'term 2 is in this text' => "foo(): Found the term 'term 2'.",
'Capitals work, TERM 3' => "bar(): Found the term 'term 3'.",
'No correct term to be found here' => false
);
$actions = array(
'foo' => array(
'term 1',
'term 2'
),
'bar' => array(
'term 3'
)
);
foreach( $tests as $content => $expected ) {
$result = search( $content, $actions );
echo $result . ( $result === $expected ? ' (CORRECT)' : ' (FALSE)' ) . PHP_EOL;
}
确实没有必要使用eval,我强烈建议反对它。