包含撇号的相同字符串的比较失败

问题描述:

我创建了一个使用PHP和XML的单词字典。用户在网页表单上的输入框中输入查询,并将该值与使用PHP的XML文件中的单词进行比较。任何与搜索词匹配的标签都会返回到HTML表格中。包含撇号的相同字符串的比较失败

整体搜索工作正常,只有一个主要问题。我有一个选项,用户可以检查以查找完全匹配。当此框被选中时,PHP脚本会进行简单的if ($searchterm == $xmlTagNodeValue)比较。它会正确返回每个字符串,包括带有非字母字符(如连字符和下划线)的字符串,并带有一个例外:包含撇号的字符串。

换句话说,can't输入到输入框在某种程度上是不是在XML文件中等于can't

我完全失败。我绝对肯定这是两个字符串中的相同字符。我甚至尝试通过复制和粘贴XML文件中的值来对输入框的值进行硬编码,并在相同的文本编辑器中打开这两个文件。但是比较总是返回错误。

我可以想象的唯一的事情就是它是某种编码问题,并且这些字符可能看起来相同但具有不同的值。但是,XML文件保存为UTF-8(如果相关,则不包含BOM),并且网页正在以UTF-8格式查看,所以我不确定我还能做什么。

+0

任何逃脱在某个点上? – 2011-12-28 02:14:44

+0

你使用十六进制编辑器来确认两个'''有相同的代码点吗? – alex 2011-12-28 02:15:20

+0

嗯......有趣。我用'filter_input'和'FILTER_SANITIZE_STRING'来抓取输入。当我停止这样做并仅使用'$ _REQUEST'时,字符串现在显示为'can''t',在撇号之前带有反斜杠。现在,我只需要一种方法来弄清楚如何阻止它...... – 2011-12-28 02:24:16

它可能不是一个编码问题,而是两个“撇号”实际上是两个不同的unicode字符。看看U+0027。 “另请参见”部分列出了六个类似的其他可能的unicode字符。这两个字符串可能包含相似但看起来不同的字符。您可能想尝试将每个字符转换为数字来确认或反驳这个理论。

+0

好吧,现在我*完全*困惑。我用'ord()'来比较两者。在XML中的一个返回为'39',但输入框中的一个(在通过消毒剂后)是'38' .... – 2011-12-28 02:40:38

+0

除非...因为38是&符号,所以大概PHP是吐出来的像'''... ...? – 2011-12-28 02:45:23

+0

好吧,我仍然不完全确定发生了什么,但最终我只是做了一个自定义过滤器。很显然,问题出在FILTER_SANITIZE_STRING上,或者由于我对其工作原理的不完全理解而更加精确。非常感谢,伙计们! – 2011-12-28 03:10:30