我在我的网站上创建了一个搜索并依赖于字符串中写的是什么术语,它需要运行不同的php代码。
例如,人们可以输入#rtp drum and bass music
,然后它会为此执行php代码。
另一种情况是,如果“播放鼓和贝司音乐的收音机”中的某些类型,我将需要它来运行不同的代码。
最后,有人可以输入#rtp robbie williams songs
,它还需要它来运行不同的代码。我的下面的代码不起作用。有什么想法吗?
if(preg_match('[#rtp|music]', $a)){
preg_match('/#rtp (.*) music/', $a, $match);
$tags = $match[1];
}
if(preg_match('[radio|that|plays|music]', $a)){
preg_match('/plays (.*) music/', $a, $match);
$tags = $match[1];
}
if(preg_match('[#rtp|songs]', $a)){
preg_match('/#rtp (.*) songs/', $a, $match);
$tags = $match[1];
}
$tags = explode(' ', $tags);
$tags = implode("%' OR `tags` LIKE '%", $tags);
$result1 = mysql_query("SELECT * FROM `Stations` WHERE `tags` LIKE '%$tags%'" );
$num_rows1 = mysql_num_rows($result1);
echo $num_rows1;
答案 0 :(得分:0)
查看您的代码,也许使用括号将按预期工作。当您使用[#rtp|music]
时,所有匹配的是#
。看看here。括号捕获您的正则表达式暗示应捕获的整个字符串。另外,使用else if
进行其他检查。这是我重写的代码。
if (preg_match('(#rtp|music)', $a)){
preg_match('/#rtp (.*) music/', $a, $match);
$tags = $match[1];
}
else if (preg_match('(radio|that|plays|music)', $a)){
preg_match('/plays (.*) music/', $a, $match);
$tags = $match[1];
}
else if (preg_match('(#rtp|songs)', $a)){
preg_match('/#rtp (.*) songs/', $a, $match);
$tags = $match[1];
}
$tags = explode(' ', $tags);
$tags = implode("%' OR `tags` LIKE '%", $tags);
$result1 = mysql_query("SELECT * FROM `Stations` WHERE `tags` LIKE '%$tags%'" );
$num_rows1 = mysql_num_rows($result1);
echo $num_rows1;
那说 - 而且我打赌我不会是唯一一个说这个的人 - 但是你应该使用mysql_*
个mysqli_*
扩展名替换所有来电,因为mysql_*
不仅仅是{{1}}从PHP 5.3开始,但在PHP 5.5中完全消失了。更多详情here。
答案 1 :(得分:0)
您必须将最后两个if
替换为elseif
,否则$tags
将被覆盖。
if(preg_match('[#rtp|music]', $a)){
preg_match('/#rtp (.*) music/', $a, $match);
$tags = $match[1];
}
elseif(preg_match('[radio|that|plays|music]', $a)){
preg_match('/plays (.*) music/', $a, $match);
$tags = $match[1];
}
elseif(preg_match('[#rtp|songs]', $a)){
preg_match('/#rtp (.*) songs/', $a, $match);
$tags = $match[1];
}
if (!empty($tags)) {
...
作为旁注,使用方括号作为模式分隔符并不是宇宙的最佳选择,因为它与字符类混淆。我建议用斜线替换它们:
if(preg_match('/#rtp|music/', $a))