2011-12-28 11 views
0

PHPとXMLを使用する単語辞書を作成しました。ユーザは、Webページフォームの入力ボックスにクエリを入力し、その値をPHPを使用してXMLファイルの単語と比較します。 nodeValueが検索語句と一致するタグはすべて、HTMLテーブルに戻されます。アポストロフィを含む同一の文字列の比較が失敗する

検索は全体的に問題なく、全体的に問題なく動作します。ユーザーが正確に一致するものを検索するためにチェックできるオプションがあります。このチェックボックスをオンにすると、PHPスクリプトは単純な比較を行いますif ($searchterm == $xmlTagNodeValue)ハイフンやアンダースコアなどのアルファベット以外の文字を含む文字列を含むすべての文字列に対して正しく戻ります。アポストロフィを含む文字列は例外です。

つまり、入力ボックスに入力されたcan'tは、何とかXMLファイルのcan'tと等しくありません。

私は完全に迷っています。私は絶対に両方の文字列で同じ文字であることを確信しています。私は、同じテキストエディタで両方のファイルを開いて、XMLファイルから値をコピーして貼り付けて、入力ボックスの値をハードコーディングしてみました。しかし、比較は常にfalseを返します。

私が想像できる唯一のことは、何らかのエンコードの問題であり、文字が同じに見えるかもしれないが、異なる値を持つことです。しかし、XMLファイルはUTF-8(関連する場合はBOMなし)として保存され、WebページはUTF-8で表示されているため、他に何ができるのか分かりません。

+0

ある時点でエスケープされているものはありますか? –

+0

16進エディタを使って2つの '' 'が同じコードポイントを持つことを確認しましたか? – alex

+0

うーん...面白いです。私は 'filter_input'と' FILTER_SANITIZE_STRING'を使って入力を取得していました。私がそれを止めて '$ _REQUEST'を使用したとき、文字列はアポストロフィの前にバックスラッシュを付けて' can \ 't'と表示します。今、私はそれを止める方法を理解する方法が必要です.... –

答えて

0

おそらくエンコードの問題ではありませんが、2つの "アポストロフィ"は実際には2つの異なるユニコード文字です。 U+0027をご覧ください。 「参照」セクションには、同様の6つの可能なUnicode文字がリストされています。 2つの文字列には同じように見えるが異なる文字が含まれている可能性があります。あなたは、この理論を確認したり反論したりするために、各文字を数字に変換しようとするかもしれません。

+0

さて、まあ、今私は完全に*混乱しています。私は 'ord()'を使って2つを比較しました。 XML内のものは '39'として返されましたが、入力ボックスからのもの(サニタイザを通過した後)は' 38'でした.... –

+0

... 38がアンパサンドなので、おそらくPHPが吐き出されている''' ...のようなもの? –

+0

さて、まあ、私はまだ何が起こっていたのか完全にはわかりませんが、最終的には私はちょうどカスタムフィルターを作った。どうやら問題はFILTER_SANITIZE_STRINGであったか、それがどのように機能するかについての私の不完全な理解でより正確になりました。ありがとう、みんな! –

関連する問題