php正则表达式过滤掉垃圾

问题描述 投票:0回答:4

所以我有一个有趣的问题:我有一个字符串,并且大多数情况下我知道会发生什么:

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 个字符,但有时它们不是,这会导致一些数据丢失并返回垃圾。

php regex sanitization garbage
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);

1
投票

如上所述,该问题无法解决。如果垃圾可以包含“普通旧普通字符”字符,并且垃圾可以落在字符串的末尾,那么您无法知道此示例中的目标字符串是“ABCDEFGH”还是“BCDEFGHI”:

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

0
投票

这些值代表什么?如果您想保留所有内容,而不必处理数据库中的垃圾,也许您应该使用 bin2hex().

对它进行十六进制编码

0
投票

您可以使用这个正则表达式:

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

© www.soinside.com 2019 - 2024. All rights reserved.