【发布时间】:2011-05-09 17:01:32
【问题描述】:
嗯 - 标题基本上就是这样。
我想查看 URL 查询,并查找特定值(单数字符或小字符串)。
我可以成功地做到这一点 - 只要我只寻找“正常”字符(那些通常被称为“安全”的字符 [a-zA-Z0-9-_.~])。
一旦我开始寻找“不安全”或“外来”字符,它就会变得丑陋。
我花了一整天(以及昨天的一部分时间)试图弄清楚这一点。
我已经阅读了大量... RFCs、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 字符的各种列表/表), 我得到以下([搜索](第一个结果)(第二个结果));
/a a a
/1 1 1
/- - -
/。 . .
/
/^ ^ %5E
/Ë ‹ %C3%8B
/à Ã %C3%A0
/Ü - %C3%9C
(/ 添加以防止插入行 + 这里的编码使这个很难发布!)
问题是 - 例如,最后一个... Ü 应该变成 %DC(据我所知)——那为什么成对的十六进制呢?
我已经尝试阅读多字节内容......但我看不到浏览器如何对 URL 中的字符进行编码, 但脚本不会。
那么 - 任何人都知道我做错了什么,或者没有做,或者已经想通了吗?
。
为了清楚起见...
...我不是在问如何替换字符(我不想把 Ü 变成 U)。
只需取一个给定的字符串,看看它是否在 URL 中(直接,或为 URL 编码)。
谢谢,希望有人能帮忙。
【问题讨论】:
标签: php url character-encoding find