BBClone 文字化けその後

とりあえず、完全に解析とまではいってないのですが、Google検索(UTF-8で渡ってくるキーワード)については動くように直してみました。
結局、やはり英語圏(というか1バイト圏)のロジックがあったので、それらを取っ払って、さらによくわかんないので・・・rawurldecodeを後ろにもってきて・・・とかとかしてみました。

 

1バイト圏のロジックというのは、適切なのかどうかわかりませんが・・・単語切り出しのロジックのbbc_get_sepの中でpreg_replace しているところで日本語検索語がなくなっちゃうとかいう問題がありました。これはpreg_replaceのパターンで単語と単語外で切り出しているんで すが、これが多分問題じゃないかと思われます。
日本語を通した際に単語?として切り出しになっているんではなくて、きっと2バイトコードを1バイトで見てるんではないかと・・。
ここらへんはPHPの内部ロジックに詳しい方が教えてくれるとありがたいんですが・・、とりあえず、そのpreg_replaceを外します。

あと、get_keywordのところのUTF-8でないもしくは$BBC_CUSTOM_CHARSETが設定されていなければstrtolowerを呼んじゃっているところを外しました(このサイトはEUC-JPなので)

これでうまくいくかもなんですが、日本語にrawurldecode
を最後の最後(上記のstrtolowerの手前に持ってくる)にしてそれまでは%XXの形で処理させるようにしました。区切りのなる+とか|とかは半角文字なので・・。
(なので、全角空白の区切りは捨てました(^^;)

一応、修正した部分を以下に記載します。
但し、SJISコードで検索してきた場合が正しく登録できるかは調べていませんのでさらに修正が必要かもぉ縲怐B
ま、ココはGoogleがほとんどなので今のところ大きな問題ではないんですが、、、ちょっとは気にしています。
分かったら、また書きますが・・・、しかし、いまだによく分かってないのに直しているっていううわさも

function bbc_get_sep($query, $array) {
// puts the query into an array
foreach ($array as $match) {
$has_sep = (strpos($query, $match) !== false) ? true : false;
$pool = $has_sep ? explode($match, $query) : array($query);

for ($i = 0, $max = count($pool); $i < $max; $i++) {
// Characters which usually aren’t needed at the beginning or end of a keyword
// $pool[$i] = preg_replace(“%^\W*(\b.+\b)\W*$%”, “\\1”, $pool[$i]);
if (empty($pool[$i]) || (strlen($pool[$i]) < 2)) {
unset($pool[$i]);
continue;
}
}
if ($has_sep) return array_values($pool);
}
return array_values($pool);
}

function bbc_get_search($array) {
// turns variable assignments to an associative array
$result = false;
$query = array(
“^as_(ep|o|e)?q=”,
“^q(_(a(ll|ny)|phrase|not)|s|t|u(ery)?)?=”,
“^s(u|2f|p\-q|earch(_?for)?|tring|zukaj)?=”,
“^k(w|e(reses|y(word)?s?))=”,
“^b(egriff|uscar?)=”,
“^w(d|ords?)?=”,
“^te(rms?|xt)=”,
“^mi?t=”,
“^heureka=”,
“^p=”,
“^r(eq)?=”,
“/search/web/”,
“^userQuery=”,
“^v[aeop]=”
);

foreach ($array as $string) {
$string = rawurldecode($string);

// skip empty GET variables
if (substr($string, -1) == “=”) continue;

foreach ($query as $key) {
preg_match(“%$key%”, $string, $matches);
if (empty($matches)) continue;

$par = $matches[0];
$pos = strpos($string, $par);
$term = substr($string, ($pos + strlen($par)));

if (strlen($term) < 2) {
$matches = array();
continue;
}
if (($par[0] == “q”) || ($par[0] == “s”)) return $term;
}
$result = isset($par) ? $term : $result;
}
return $result;
}

function bbc_get_keywords($ref) {
$var_sep = array(“&”, “|”);
$word_sep = array( “+”, ” “, “/”);
$match = array(
“ara”, “busca”, “pesquis”, “search”, “srch”, “seek”, “zoek”, “result”, “szuka”, “cherch”, “such”, “find”,
“trouve”, “trova”, “pursuit”, “keres”, “katalogus”, “alltheinternet.com”, “mamma.com”, “baidu.com”, “heureka.hu”,
“kartoo.com”, “ask.com”, “aport.ru”, “google”, “yahoo”
);

foreach ($match as $key) {
$is_search = (strpos(strtolower($ref), $key) !== false) ? true : false;

if ($is_search) break;
}

if (!$is_search) return false;

// $ref = bbc_specialchars_decode(rawurldecode($ref));
$ref = bbc_specialchars_decode($ref);
$is_query = mb_strrpos($ref, “?”);
$ref = ($is_query !== false) ? mb_substr($ref, ++$is_query) : mb_substr($ref, (mb_strpos($ref, “://”) + 3));
$get_vars = bbc_get_sep($ref, $var_sep);
$raw_search = bbc_get_search($get_vars);
if ($raw_search === false) return false;

// Conversion of keywords, if applicable
/*
$raw_search = rawurldecode($raw_search);
$from = extension_loaded(“mbstring”) ? bbc_get_encoding($raw_search) : false;
$char = (defined(“_BBC_CUSTOM_CHARSET”)) ? _BBC_CUSTOM_CHARSET : false;
$raw_search = (($from !== false) || extension_loaded(“recode”)) ?
bbc_convert_lang($raw_search, $from, $char) : $raw_search;
*/
$flt_search = bbc_get_sep($raw_search, $word_sep);
$from = extension_loaded(“mbstring”) ? bbc_get_encoding($raw_search) : false;
$char = (defined(“_BBC_CUSTOM_CHARSET”)) ? _BBC_CUSTOM_CHARSET : false;

for ($i = 0, $j = count($flt_search); $i < $j; $i++) {
// strtolower messes up UTF-8 so we leave things case sensitive if it’s
// requested as charset
// $tmp = (!$char || !stristr($char, “UTF”)) ? strtolower(bbc_clean($flt_search[$i])) : bbc_clean($flt_search[$i]);
$tmp = rawurldecode($flt_search[$i]);
$tmp = (($from !== false) || extension_loaded(“recode”)) ?
bbc_convert_lang($tmp, $from, $char) : $tmp;
$tmp = bbc_clean($tmp);
// Filter search engine cache indicator
if (preg_match(“%^(cache|tbn)\:[A-Za-z0-9_\-]{8,}%”, $tmp) || (strlen($tmp) < 2) || (strlen($tmp) > 100)) {
unset($flt_search[$i]);
continue;
}
$flt_search[$i] = $tmp;
}
return (!empty($flt_search) ? $flt_search : false);
}
UTF-8版でも使えると思いますが、config.phpの$BBC_CUSTOM_CHARSET及びLangのja.phpは合わせて下さい

プッシュ通知を