【问题标题】:php : Looking for specific character(s) in a URL Query - struggling with non-asciiphp : 在 URL 查询中寻找特定字符 - 与非 ascii 作斗争
【发布时间】: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


【解决方案1】:

不同的结果是由于不同的字符编码。今天的浏览器通常在直接输入地址栏时使用 UTF-8 对文本进行编码,而 Ü 以 UTF-8 编码为 0xC39C,则使用 %C3%9C 编码,因为 0xC3 和 0x9C 都不是 URL 中的有效字节。如果你用像 Windows-1252 这样的单字节字符编码来解释 0xC39C,你会得到两个字符 à (0xC3) 和 œ (0x9C)。

【讨论】:

  • 这太棒了 - 我几乎理解它:D 谢谢。我认为您没有解决方案来搜索“Ü”之类的字符并将它们与 URL 编码相同吗? (URL 将“Ü”编码为“%DC”——我所做的一切似乎都没有得到这个结果)再次感谢。
  • @theclueless1:检查可能使用的字符编码,并在必要时进行转换。
  • 正如我所说的 - 我已经尝试检测编码类型等......我得到 ASCII(安全字符)或 UTF-8(不安全/外国)。 -------- 但是 -------- 我可能已经成功了......请参阅下面的答案?
  • 我可能刚刚经历了一次突破。使用上面提供的小脚本,在第二半 ... 更改 // 基础 - 对搜索到的值进行编码,并替换任何双重编码的 % 字符 $needle = str_replace('%25','%',rawurlencode($针));到 $needle = urlencode(mb_convert_encoding($needle, "ISO-8859-1", "UTF-8"));这似乎有效。
  • 我还没有看到任何需要转换为完全不同的编码类型,然后重新编码的地方......也不知道如何/为什么......我是 esp。我必须将其从 UTF-8 中分离出来,这让我感到困惑……因为我认为这就是 URL 的本意?但是-谢谢-Gumbo- ...永远不会做到(也不会想到)
猜你喜欢
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2021-03-20
  • 1970-01-01
  • 2020-02-25
  • 2019-05-13
  • 1970-01-01
相关资源
最近更新 更多