Question

J'ai donc un problème intéressant: je une chaîne, et pour la plupart je sais à quoi vous attendre:

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

Sauf dans ce cas, les? 'S sont soit des lettres majuscules ou chiffres. Le problème est, la chaîne a déchets mélangés: la chaîne est divisée en 5 ou 6 morceaux, et entre il y a beaucoup de malbouffe: caractères non imprimables, des caractères étrangers, ainsi que de vieux caractères normaux simples. Bref, des choses qui est susceptible de ressembler à ceci: Nyth = mî; Emy × nüqÏ

En général, les 8 derniers caractères (le? S) sont ensemble juste à la fin, donc au moment où je viens de PHP saisir les 8 derniers caractères et de l'espoir pour le meilleur. De temps en temps, cela ne fonctionne pas, donc je besoin d'une solution plus robuste.

Le problème est techniquement impossible à résoudre, mais je pense que la meilleure solution est de saisir les caractères de la fin de la chaîne alors qu'ils sont le cas ou le format numérique. Si je reçois 8 ou plus, supposons que cela est exact. Dans le cas contraire, trouver le st = et caractères d'appui aller de l'avant autant que je dois remplir le quota de 8 caractères. Est-il possible de le faire regex ou dois-je me retrousser les manches et aller style boucle imbriquée?

Mise à jour:

Pour éclaircir une certaine confusion, je reçois une chaîne d'entrée qui est comme ceci:

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

sauf les ordures sont dans des endroits imprévisibles de la chaîne (sauf la fin est jamais ordures), et a une longueur imprévisible (au moins, je suis en mesure de trouver des modèles dans aucun des deux). ? En général, les s sont tous ensemble moi donc tout simplement saisissant les 8 derniers caractères, mais parfois ils ne sont pas ce qui se traduit par des données manquantes et les déchets retournés: - \

Était-ce utile?

La solution

$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, qui était une blague. Voici une regex pour vous:

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

Autres conseils

Comme indiqué, le problème est insoluble. Si la poubelle peut contenir « bon vieux caractères normaux » caractères, et les ordures peut tomber à la fin de la chaîne, alors vous ne pouvez pas savoir si la chaîne cible de cet échantillon est « ABCDEFGH » ou « BCDEFGHI »:

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

Qu'est-ce que ces valeurs représentent-ils? Si vous souhaitez conserver tout cela, juste sans avoir à traiter avec les ordures dans votre base de données, peut-être vous devriez jeter un sort-encoder à l'aide bin2hex () .

Vous pouvez utiliser cette expression régulière:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top