php:在URL查询中寻找特定字符 - 与非ascii挣扎

时间:2011-05-09 17:01:32

标签: php url character-encoding find

嗯 - 标题基本上都是这样说的 我想查看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编码)。

谢谢,我希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

不同的结果是由于不同的字符编码。今天的浏览器通常使用UTF-8直接输入位置栏时编码文本,Ü编码为UTF-8(0xC39C),编码为%C3%9C,因为0xC3和0x9C都不是有效字节网址。如果您使用像Windows-1252这样的单字节字符编码来解释0xC39C,您将获得两个字符Ã(0xC3)和œ(0x9C)。