0

だから私は興味深い問題を抱えています: 私は文字列を持っています.

http://www.someurl.com/st= ????????

この場合を除き、? は大文字または数字です。問題は、文字列にガベージが混在していることです。文字列は 5 つまたは 6 つの部分に分割されており、その間に多くのがらくたがあります: 印刷できない文字、外国の文字、および単純な古い通常の文字。要するに、次のようになりがちなもの: Nyþ=mî;ëMÝ×nüqÏ

通常、最後の 8 文字 (?) は最後にまとめられるので、現時点では PHP に最後の 8 文字を取得させて、最善を尽くすようにしています。時々、それがうまくいかないので、より堅牢なソリューションが必要です。

問題は技術的に解決できませんが、最善の解決策は文字列の末尾から大文字または数字を取得することだと思います。8 つ以上出たら、それが正しいと仮定します。それ以外の場合は、 st= を見つけて、8 文字のクォータを満たすのに必要な数だけ文字を取得します。これを行う正規表現の方法はありますか、それとも袖をまくり上げてネストループスタイルにする必要がありますか?

アップデート:

混乱を解消するために、次のような入力文字列を取得します。

[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]????????

ただし、ガベージは文字列内の予測できない場所にあり (最後がガベージではないことを除いて)、予測できない長さです (少なくとも、どちらにもパターンを見つけることができませんでした)。通常、?s はすべて一緒なので、最後の 8 文字を取得するだけですが、データが欠落してガベージが返されることがあります:-\

4

4 に答える 4

6
$var = '†http://þ=www.ex;üßample-website.î;ëcomÝ×ü/joy_hÏere.html'; // test case

$clean = join(
    array_filter(
        str_split($var, 1),
        function ($char) {
            return (
                array_key_exists(
                    $char,
                    array_flip(array_merge(
                        range('A','Z'),
                        range('a','z'),
                        range((string)'0',(string)'9'),
                        array(':','.','/','-','_')
                    ))
                )
            );
        }
    )
);

はぁ、冗談でした。これがあなたのための正規表現です:

$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);
于 2009-11-18T23:15:12.747 に答える
1

おっしゃる通り、問題は解けません。ガベージに「普通の古い通常の文字」の文字が含まれている可能性があり、ガベージが文字列の末尾にある可能性がある場合、このサンプルのターゲット文字列が「ABCDEFGH」と「BCDEFGHI」のどちらであるかを知ることはできません。

__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__
于 2009-11-18T23:29:39.550 に答える
0

次の正規表現を使用できます。

if (preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $string) ==1)

于 2015-05-13T11:12:32.990 に答える
0

これらの値は何を表していますか? データベース内のガベージを処理する必要なく、すべてを保持したい場合は、bin2hex()を使用して 16 進エンコードする必要があります。

于 2009-11-18T23:03:08.403 に答える