質問

そこで、興味深い問題があります。文字列があり、ほとんどの場合、何を期待するかはわかっています。

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]????????

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

役に立ちましたか?

解決

$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);

他のヒント

に述べたように、問題は解決不能です。ゴミは「昔ながらの通常の文字」の文字を含めることができ、ゴミが文字列の末尾に落ちることができる場合は、このサンプルからターゲット文字列が「ABCDEFGH」または「BCDEFGHI」であるかどうかを知ることはできません。

__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__

これらの値は何を表しているのでしょうか?データベース内のガベージを処理せずに、すべてを保持したい場合は、次の方法で 16 進エンコードする必要があるかもしれません。 bin2hex().

あなたは、この正規表現を使用することができます:

もし(するpreg_match( '/ [\' ^£$%&*()} {@#〜> <>、|?= _ +¬ - ] /」、$文字列)== 1)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top