【问题标题】:PHP string comparison won't match seemingly identical stringPHP字符串比较不会匹配看似相同的字符串
【发布时间】:2014-05-15 05:58:10
【问题描述】:

我正在使用 PHP 抓取静态站点的 DOM,并提取特定的数据位,以便将内容放入数据库中。

对于这个例子,我将元素的内部 HTML 存储到 $domString,我可以看到字符串是“描述”,但是当我将代码中的 $domString 与“描述”进行比较时,没有匹配项.

if($domString == 'Description') {
    // This is not happening, even though I know
    // $domString contains 'Description' :(
}

我有条纹空白和其他东西,当我 var_dump() 他们都出来时,我得到了这个:

string(45) "Description"
string(11) "Description"

按照 Álvaro G. Vicario 的建议,通过 bin2hex() 运行它们分别返回以下两个值:

3c74642076616c69676e3d22746f702220636f6c7370616e3d2232223e4465736372697074696f6e3c2f74643e
4465736372697074696f6e

我需要一种方法来消除第一个字符串。

【问题讨论】:

  • 如果你这样做trim($domString) == 'Description' 会怎样?
  • @AbhikChakraborty 我想这不是问题,因为通常空格会显示在var_dump();
  • 如果两个字符串有不同的编码可能会发生这种情况
  • 里面有软连字符吗?
  • 对这两个字符串尝试mb_detect_encoding($str),然后使用mb_convert_encoding(domString, /*same_encoding*/)将它们都转换为相同的编码,看看它们是否仍然相同。

标签: php


【解决方案1】:

括号中的数字是总字节数。显然,一个 45 字节的字符串不能和一个 11 字节的字符串完全相同。

您可以使用bin2hex() 来检查确切的字节。我还建议您不要将输出视为 HTML——在大多数浏览器中,您可以按 Ctrl+U

编辑:询问为什么两个给定的字符串在被网络浏览器处理后呈现相同的单词,最好通过实际查看真实的原始数据来回答(而不是只查看由浏览器)。

编辑#2:

var_dump( hex2bin('3c74642077696474683d223832222076616c69676e3d22746f70223e547970653c2f74643e') );

...打印这个:

string(37) "<td width="82" valign="top">Type</td>"

你想strip HTML tags 还是什么?您看到原始 HTML 了吗?

【讨论】:

  • 是的,字节串不一样。但是,我该如何进行这种比较,我想将其标准化是否合理?
  • 如何比较两种水果?这取决于您的数据和您对相等的定义。桃子和苹果有区别吗?如果你问它们是否是球形的呢?
  • 我是说作为人类;如果我看到一个字符串“描述”和另一个字符串“描述”,我希望以与它们在屏幕上的呈现匹配相同的方式获得正匹配。这是一个完全疯狂的要求吗?
  • 为了配合,我会检查实际数据。为什么要猜测?
  • bin2Hex() 显示:3c74642077696474683d223832222076616c69676e3d22746f70223e547970653c2f74643e 和 4465736372697074696f6e
【解决方案2】:

你应该质疑为什么会发生这种情况

string(45) "Description"
string(11) "Description"

第二个是 11 个字符,第一个是 45 个字符!为什么?所以有一些隐藏(未显示)的字符\符号。这就是为什么这个字符串不相等的原因。

试试这个Remove control characters from php String

【讨论】:

    【解决方案3】:

    解决方案是使用正则表达式 像这样

        function clean($string) {
    $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
    return preg_replace('/[^A-Za-z0-9\-\;\,\?\*\%\@\$\!\(\)\#\=\&]/', '', $string); // Removes special chars
    }
    

    将其调整为您需要的特殊字符,或者不添加您想要继续捕获的字符,例如 \# 或 esle \=

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2011-08-17
      • 2014-12-30
      • 2010-10-19
      • 2022-03-30
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多