嗯 - 标题基本上都是这样说的 我想查看URL查询,并查找特定值(单数字符或小字符串)。
我可以成功地做到这一点 - 只要我只寻找“正常”字符(那些通常被称为“安全”的字符[a-zA-Z0-9 -_ .~])。
一旦我开始寻找“不安全”或“外国”角色,它就会变得丑陋
我花了整整一天(也是昨天的一部分)试图解决这个问题
我读过很多... RFC,php.net用于编码,检测编码等。
我甚至试图将编码/字符集设置在脚本等的顶部。
我已经完成了各种编码选项,动态设置,手动设置等
没有任何效果。
尝试下面的小脚本。
将其打入文件并访问它 - 并在下面附加查询路径;
?q = a1 - 。< ^ËàÜ
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
$needles = array(
needle1 => 'a',
needle2 => '1',
needle3 => '-',
needle4 => '.',
needle5 => '<',
needle6 => '^',
needle7 => 'Ë',
needle8 => 'à',
needle9 => 'Ü'
);
$haystack = parse_url(curPageURL(), PHP_URL_QUERY);
if (!empty($haystack)) {
$needlelist = implode(' | ',$needles);
echo "We are looking for some needles ( ".$needlelist." ) in a haystack (".$haystack.")<br/>";
foreach ($needles as $key=>$needle) {
echo "We are looking for ".$key."<br/>";
$check = strpos($haystack,$needle);
if ($check !== false) {
echo " - Yes : we found a needle (".$needle.") in the haystack";
} else {
echo " - No : we failed to find the needle (".$needle.") in the haystack";
}
echo "<br/>";
}
echo "--------------<br/>now lets try it with a little basing?<br/>";
foreach ($needles as $key=>$needle) {
echo "We are looking for ".$key."<br/>";
// Basing - encode the searched for value, and replace any double-encoded % chars
$needle = str_replace('%25','%',rawurlencode($needle));
$check = strpos($haystack,$needle);
if ($check !== false) {
echo " - Yes : we found a needle (".$needle.") in the haystack";
} else {
echo " - No : we failed to find the needle (".$needle.") in the haystack";
}
echo "<br/>";
}
}
我不知道你,但不是奇怪的字符,或者它们正确的十六进制代码(根据urlencoded字符的各种列表/表格), 我得到以下([搜索](第1结果)(第2结果));
/ a a a
/ 1 1 1
/ - - -
/。 。 。
/&LT; &LT; %3C
/ ^ ^%5E
/ËÃ<%C3%8B
/àÃ%C3%A0
/ܜ%C3%9C
( /添加以防止行插入+此处的编码使得这很难发布!)
问题是 - 例如,最后一个...... Ü应该成为%DC(据我所知) - 为什么配对的十六进制?
我已经尝试过阅读多字节内容...但我没有看到浏览器如何编码URL中的字符, 但剧本不会。
所以 - 任何人都会看到我做错了什么,或者没做,或者已经弄明白了?
。
为了清晰... ... ......我不是要问如何更换角色(我不想把Ü变成U)。 只需获取一个给定的字符串,看看它是否在URL中(直接或为URL编码)。
谢谢,我希望有人可以提供帮助。
答案 0 :(得分:0)
不同的结果是由于不同的字符编码。今天的浏览器通常使用UTF-8直接输入位置栏时编码文本,Ü
编码为UTF-8(0xC39C),编码为%C3%9C
,因为0xC3和0x9C都不是有效字节网址。如果您使用像Windows-1252这样的单字节字符编码来解释0xC39C,您将获得两个字符Ã
(0xC3)和œ
(0x9C)。