Php $var==';string1';|';string2&x27;总是返回TRUE

Php $var==';string1';|';string2&x27;总是返回TRUE,php,Php,我想根据question参数回显$q2和$q3,但不管参数的值是多少,它总是给我相同的值。我做错了什么 $q1 = $_GET['question']; if ($q1 == "domaina.com"||".domaina.com"||"domaina.co") { $q2 = 'domaina'; $q3 = 'DomainA'; } elseif ($q1 == "domainb.com"||".domainb.com"||"domainb.co") { $q2 =

我想根据question参数回显$q2和$q3,但不管参数的值是多少,它总是给我相同的值。我做错了什么

$q1 = $_GET['question'];
if ($q1 == "domaina.com"||".domaina.com"||"domaina.co")
{
    $q2 = 'domaina';
    $q3 = 'DomainA';
}
elseif ($q1 == "domainb.com"||".domainb.com"||"domainb.co")
{
    $q2 = 'domainb';
    $q3 = 'DomainB';
}
elseif ($q1 == "domainc.com"||".domainc.com"||"domainc.co")
{
    $q2 = 'domainc';
    $q3 = 'DomainC';
}
else {
    $q2 = 'noquestions';
    $q3 = 'NoQuestions';
} 

任何非空字符串的计算结果均为true,因此您的第一个“or”语句的计算结果始终为true

这样做的权利是:

if ($q1 == "domaina.com"||$q1 == ".domaina.com"||$q1 == "domaina.co")
而不是

if ($q1 == "domaina.com"||".domaina.com"||"domaina.co")

您需要将其格式化如下:

if ($q1 == "domaina.com" || $q1 == ".domaina.com" || $q1 == "domaina.co")
你所做的被解释为:

if ($q1 == ("domaina.com" || ".domaina.com" || "domaina.co"))
// interpreted as: 
if ($q1 == (((bool)"domaina.com" || (bool)".domaina.com" || (bool)"domaina.co"))
// interpreted as: 
if ($q1 == ((true || true || true))
// interpreted as: 
if ($q1 == true)
// interpreted as: 
if ((bool)$q1 == true))

还请注意,如果您使用
==
运算符,则最后一个条件将始终计算为true,而不是第一个条件,因为您将比较字符串与布尔运算的结果。

您的==语句中有一个错误

应该是这样的:

$q1 = $_GET['question'];
if ($q1 == "domaina.com"|| $q1 ==  ".domaina.com"|| $q1 == "domaina.co")
{
    $q2 = 'domaina';
    $q3 = 'DomainA';
}
elseif ($q1 == "domainb.com"|| $q1 == ".domainb.com"||$q1 == "domainb.co")
{
    $q2 = 'domainb';
    $q3 = 'DomainB';
}
elseif ($q1 == "domainc.com"||$q1 == ".domainc.com"||$q1 == "domainc.co")
{$q2 = 'domainc';
$q3 = 'DomainC';
}
    else {$q2 = 'noquestions';
    $q3 = 'NoQuestions';
} 
您也可以在数组中使用

$q1 = $_GET['question'];
if(in_array("$q1", array("domaina.com",".domaina.com",""domaina.co"")))
{
    $q2 = 'domaina';
    $q3 = 'DomainA';
}
    //...

以下内容将始终计算为true

if ($q1 == "domaina.com"||".domaina.com"||"domaina.co")
你可能是说:

if ($q1 == "domaina.com"||$q1 == ".domaina.com"||$q1 == "domaina.co")

你在ifs中的条件句是错误的。试着先把它们修好

if ($q1 == "domaina.com"||$q1 == ".domaina.com"||$q1 == "domaina.co")
{
    ...
}
太重复了

$q1 = $_GET['question'];
$q2 = 'noquestions';
$q3 = 'NoQuestions';
if (preg_match('~^.?domain([a-c])\.com?$~',$q1,$m)) {
  $q2 = 'domain'.$m[1];
  $q3 = 'Domain'.strtoupper($m[1]);
}

顺便说一句,让您知道,您编写代码的方式(没有缩进或空格)非常糟糕。

您可以使用以下strpos函数来简化if语句:

$q1 = $_GET['question'];
if (strpos($q1, "domaina") === true) {
    $q2 = "domaina";
    $q3 = "DomainA";
} elseif (strpos($q1, "domainb") === true) {
    $q2 = "domainb";
    $q3 = "DomainB";
} elseif (strpos($q1, "domainc") === true) {
    $q2 = "domainc";
    $q3 = "DomainC";
} else {
    $q2 = "noquestions";
    $q3 = "NoQuestion";
}

我认为您可以稍微简化代码:

<?php

$q1 = $_GET['question'];
$q2 = getDomain($q1);
$q3 = ucfirst(substr($q2, 0, -1)) + strtoupper(substr($q2, -1));

function getDomain($url){
   $arrA = array('domaina.com', '.domaina.com', 'domaina.co');
   $arrB = array('domaina.com', '.domaina.com', 'domaina.co');
   $arrC = array('domaina.com', '.domaina.com', 'domaina.co');

   $q1 = strtolower($url);
   if(in_array($q1, $arrA))
      return "domaina";
   if(in_array($q1, $arrB))
      return "domainb";
   if(in_array($q1, $arrC))
      return "domainc";

   return '';
}
?>

可能是第一位,但最初的占位符答案并没有解决问题。Wesley Murch:我“不忽略”了[php]标记,快速浏览了一下最近的php问题。。。啊,一开始我忽略标签的原因之一。