【问题标题】:Why PHP setCookie() sets another variable as a cookie than I want?为什么 PHP setCookie() 将另一个变量设置为我想要的 cookie?
【发布时间】:2018-02-26 00:35:01
【问题描述】:

我想将 price[0] 设置为 cookie,但它似乎将 $ln 设置为 cookie,因为无论我将 $price[0] 还是 $ln 作为参数,它都显示给我变化相同的输出。 $price[0] 是一个浮点值。

代码如下:

function getPrice($url){
  $str = file_get_contents($url);
  $lines = explode("\n",$str);
  foreach ($lines as $ln) {
    $target = 'class="text-large2" data-currency-value';
    if(strstr($ln,$target)){
      $regex = "/(.*?)<\/span/";
      preg_match($regex, $ln, $price);
      setcookie("price",$price[0],0,"/");
      break;
    }
   }
  }

代码说明: 我得到一个网站的源代码,搜索包含 $target 的特定行,在这一行中,我在 preg_match() 的帮助下搜索价格。如前所述,我想将第一个结果设置为 cookie。

如果需要,这里是我使用的网址:

$url = "https://coinmarketcap.com/currencies/bitcoin/";

我已经尝试将 price[0] 转换为字符串,但它没有帮助,我在 AJAX 请求上运行此函数,这就是我必须在 setCookie() 中设置路径的原因。

Cookies which I do get setting $ln and $price[0]

【问题讨论】:

  • ' 它以两种变体向我展示了相同的输出' - 你得到什么输出?
  • 对不起,我忘记了。我在问题的末尾添加了一张图片
  • 在 cookie 中设置值之前打印 $price[0]
  • 你的意思是 echo 吗?它打印出正确的预期值。

标签: php regex cookies


【解决方案1】:

setCookie 应该在进行任何输出(甚至是空白)之前执行。所以在包含函数的文件中,首先使用ob_start();,然后使用所有代码,然后使用ob_end_flush();

将文件编码为不带 BOM 的 UTF-8 以查看其是否有效。

编辑: 上面所说的是解决setCookie 因不同原因而不起作用的情况。 以下解释足以满足当前场景。

我认为 OP 面临的问题是: OP可以写下面这行-

 setcookie("price",$price[0],0,"/");

作为 -

setcookie("price",$ln,0,"/");

仍然会产生相同的结果。

事实上,这是预期的结果。使用以下 2 行:

$ln=htmlspecialchars($ln);
echo "<br/> ln found = ".$ln;

我发现了以下输出:

ln found = <span class="text-large2" data-currency-value>9740.30</span>

让我们看一下OP中的以下两行:

 $target = 'class="text-large2" data-currency-value';
    if(strstr($ln,$target)){

if 条件变为true 时,则$target$ln 中找到。然后preg_match 尝试搜索模式,即"/(.*?)&lt;\/span/"preg_match 将结果作为数组存储在 price 中。 数组中的第一个元素(即$price[0] 变量)变为完整的$ln,除了最后一个&gt;,即&lt;span class="text-large2" data-currency-value&gt;9740.30&lt;/span。但是不使用htmlspecialchars,HTML 标记只是保持不可见

现在,当您在 setCookie 中使用 $ln$price[0] 时,您会得到相同的结果,即 9740.30。

【讨论】:

  • 我就是这个意思
  • 你现在遇到什么问题?
  • 改变了我的答案
  • 和以前一样。你自己试过吗?它对你有用吗?
  • 在一个简单的 PHP 脚本中运行它,而不是在一个 ajax 调用中,然后查看结果
【解决方案2】:

您只在文本中最早可能的位置搜索单个目标浮点数。由于这些原因,您不需要explode(),不需要循环,当然也不应该使用strstr() 来搜索子字符串字符串的存在。 (Read Note #2)

function getPrice($url){
    $str=file_get_contents($url);
    if(preg_match('~<span class="text-large2"\s+data-currency-value>\K\d+.\d+~',$str,$out)){
        setcookie('price',$out[0],0,'/');
        return true;
    }
    return false;
}

\K 将重新开始全字符串匹配,这意味着[0] 将包含所需的值。在您的编码尝试中,您使用了一个捕获组——即 Capture Group #1——并试图访问全字符串匹配 ([0])。这就是为什么您不断收到完整的$ln

此外,除了极少数例外,函数应该return 一些东西。如果匹配成功返回true,否则返回false。这使您能够在应用程序中编写某种条件警报。

我无法测试我的模式,因为您的问题没有提供示例输入。如果我的回答对您不起作用,请改进您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2021-02-17
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多