好的,我现在正在尝试扩展我之前解决过的一些代码。 下面的代码将一个短语分配到搜索框中,并尝试执行以下操作: 1)清理我不想要的东西(注意:输入是经过预处理的,所以我现在只需要更多的东西,并且仍在处理这部分)。 2)使用空格作为分隔符将短语分成单个单词 3)检查提取的每个单词,以查看前3个字符中是否存在*,如果是,则中止该过程 4)检查是否使用了“和”或“或” - 如果是,则不加修改地应用它们 - 如果不是,则在短语中插入“和”。 (如果用户没有自己指定,最终会自动将短语转换为“和”短语)。 5)在整个过程中,$ keyword被重建,最后我回显最后的新$关键字来测试结果......当然,随后会使用新的关键字更多代码。
if ($keyword) {
$clean = preg_replace('/[^a-zA-Z0-9 *_&]/','',$keyword);
$token = strtok($clean, " ");
$keyword = $token;
while ($token !== false) {
$pos = stripos($token, "*");
if ($pos < 3 && $pos !== false) {
return;
}
$token = strtok(" ");
if ($token == "and" || $token == "or") {
$keyword = $keyword . " " . $token;
} elseif ($token) {
$keyword = $keyword . " and " . $token;
}
}
echo $keyword;
问题:
一切正常,除了某些原因ELSEIF声明总是正确的?!无论我做什么,都会插入额外的'和',无论上面的if语句是否为真。我已经验证了初始的if语句是否有效,它会检测'和'或'或'是否存在并相应地应用它......但是它会继续处理ELSEIF!我甚至尝试过:
elseif ($token !== "and" && $token !== "or" && $token !== false)
但最终,所产生的短语最终会以'和'或'或者和'结束,无论如何。
(注意:我意识到有比preg_replace更好的选择,但我会在另一个时间调查 - 所以对于这个问题,我只是想解决ELSEIF困境,谢谢)
附加MODS基于回复......
所以,我把代码改为......
$token = strtok(" ");
if (in_array($token, array( 'and', 'or' ))) {
$keyword = $keyword . " " . $token;
} elseif (!empty($token)) {
$keyword = $keyword . " and " . $token;
}
但结果仍然不正确。例如:
“白色足球赫尔穆特”确实变成了“白色足球和赫尔穆特”, 然而... “白色,足球和赫尔穆特”变成了“白色,足球和赫尔穆特”。如果if为真,我只是看不到ifelse如何处理?
注意:为了验证IF部分是否正常工作,我在该声明中放置了一个x:
if (in_array($token, array( 'and', 'or' ))) {
$keyword = $keyword . " x" . $token;
“白色和橄榄球和赫尔穆特”导致“白色xand和橄榄球xand和helmut”。此外,“白色和橄榄球头盔”(没有第二和)导致“白色xand和橄榄球和赫尔穆特”。 !因此,IF语句按预期处理 - 只是不是ELSEIF !!
答案 0 :(得分:2)
@Soyo:试试这个 -
if ($token == 'and' || $token == 'or') {
// do nothing here to avoid duplicating 'and'
}
elseif (!empty($token)) {
$keyword = $keyword . ' and ' . $token;
}
<强>更新强>
这是我用来测试的脚本 -
$keyword = 'white and and or and football and or helmut and';
if ($keyword)
{
$clean = preg_replace('/[^a-zA-Z0-9 *_&]/', '', $keyword);
$token = strtok($clean, ' ');
$keyword = $token;
while ($token !== false)
{
$pos = stripos($token, '*');
if ($pos < 3 && $pos !== false)
{
return;
}
$token = strtok(' ');
if (in_array(strtolower($token), array('and', 'or'))) {
// do nothing here!
} elseif (!empty($token)) {
$keyword = $keyword . ' and ' . $token;
}
}
echo $keyword;
}
答案 1 :(得分:1)
您需要检查当前和以前的令牌是否都不是“和”/“或”。
$prevToken = $token;
$token = strtok(" ");
if ($token == "and" || $token == "or"
|| $prevToken == "and" || $prevToken == "or"
) {
$keyword = $keyword . " " . $token;
} elseif ($token) {
$keyword = $keyword . " and " . $token;
}
使用“white and football helmut”,逻辑目前是这样的:
$keyword
最初是“白色”" "
加上标记"and"
。现在$ keyword是"white and"
。" and "
加"football"
。现在$ keyword是"white and and football"
。这就是你如何获得双重“和”。检查当前和前一个令牌,以避免连续“和”/“或”。
答案 2 :(得分:0)
我认为您正在检查elif
中的错误变种。
请改为尝试:
elseif ($keyword !== "and" && $keyword !== "or" && $token !== false)