Frage

Also habe ich ein interessantes Problem: Ich habe eine Zeichenfolge, und zum größten Teil weiß ich, was zu erwarten:

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

Außer in diesem Fall sind die? 'S sind entweder Großbuchstaben oder Zahlen. Das Problem ist, hat der String Müll in gemischt: der String wird in 5 oder 6 Stücke zerbrochen, und dazwischen gibt es viel Junk: unprintable Zeichen, fremde Zeichen, sowie das gute alte normale Zeichen. Kurz gesagt, Sachen, die wie folgt aussehen apt ist: Nyth = mî; Emy × nüqÏ

In der Regel sind die letzten 8 Zeichen (die? 'S) miteinander direkt am Ende, so im Moment habe ich nur greifen PHP die letzten 8 Zeichen und das Beste hoffen. Gelegentlich das nicht funktioniert, so dass ich eine robustere Lösung benötigen.

Das Problem ist technisch unlösbares, aber ich denke, die beste Lösung aus dem Ende der Zeichenfolge zu greifen Zeichen ist, während sie in Groß- oder numerisch sind. Wenn ich 8 oder mehr erhalten, davon aus, dass richtig ist. Ansonsten finden die st = und greifen Zeichen so viele gehen nach vorne, als ich die 8 Zeichen Quote füllen müssen. Gibt es einen regex Weg, dies zu tun, oder werde ich brauche, um meine Ärmel zu und Nested-Loop-Stil gehen?

Update:

Um einige Verwirrung aufklären, ich eine Eingabezeichenfolge erhalten, dass das wie folgt aus:

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

außer der Müll ist in unvorhersehbaren Orten in der Zeichenfolge (außer das Ende nie Müll ist) und hat unberechenbar Länge (zumindest ich in der Lage gewesen, Muster zu finden, in keines von beiden). ? Normalerweise sind die s sind alle zusammen damit nur ich die letzten 8 Zeichen greifen, aber manchmal sind sie nicht, welche Ergebnisse in einigen fehlenden Daten und zurück Müll: - \

War es hilfreich?

Lösung

$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(':','.','/','-','_')
                    ))
                )
            );
        }
    )
);

Hah, das war ein Witz. Hier ist ein regulärer Ausdruck für Sie:

$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);

Andere Tipps

Wie bereits erwähnt, ist das Problem unlösbar. Wenn der Müll „plain old normale Zeichen“ Zeichen enthält, und der Müll am Ende des Strings fallen kann, dann weiß man nicht, ob die Zielzeichenfolge aus dieser Probe ist „ABCDEFGH“ oder „BCDEFGHI“:

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

Was bedeuten diese Werte? Wenn Sie alles behalten wollen, nur ohne in Ihrer Datenbank mit Müll beschäftigen zu müssen, sollten Sie vielleicht verhexen kodieren sie mit bin2hex () .

Sie können diesen regulären Ausdruck verwenden:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top