所以我有一个有趣的问题:我有一串,并为大部分我知道什么期望:

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

除了在这种情况下,?'s要么是上写字母或数字。问题是,串有生活垃圾混在:串分为5个或6个,而在之间有很多的垃圾:不可打印的字符,外国文字,以及普通老正常的人物。在短期,东西这很容易这样的:Nyþ=mî;ëMÝ×nüqÏ

通常的最后一个8字符的(?'s)的一起正在结束,这样的时刻我只是有PHP抓住最后一个8字,并最好的希望。偶尔,这并不工作,所以我需要一个更强大的解决方案。

问题在技术上是无法解决的,但我认为最好的解决办法是要抓住字从结束串的同时,他们上的情况或数字。如果我得到8个或更多,假设是正确的。否则,找到st=并抓住人物向前发展的许多作为我需要填补的8个字符的配额。是否有一个regex的方式做到这一点,或者将需要我卷起我的袖子和转嵌套循环的风格?

更新:

要澄清一些混淆,我得到一个输入串就是这样的:

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

除了这垃圾是在不可预测在字符串中的位置(除端从来没有垃圾),并且具有不可预测的长度(至少,我已经能够找到的模式在这两).通常?s都在一起,因此我刚刚抓住的最后一个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(':','.','/','-','_')
                    ))
                )
            );
        }
    )
);

哈,那是一个笑话。这里有一个regex你:

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

其他提示

如上所述,问题是无法解决的。如果垃圾可以包含"普通的老式正常人物"的人物,而垃圾可能落在最后的string,然后你不知道是否该目标串从这个样本中是"ABCDEFGH"或"BCDEFGHI":

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

什么做这些价值代表什么?如果你想要保留所有它,就没有必要处理垃圾数据库中,也许你应该进制编码就使用 bin2hex().

你可以使用这个规则的表达:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top