2009-11-18 23 views
0

所以,我有一個有趣的問題:我有一個字符串,並且在大多數情況下我知道會發生什麼:PHP正則表達式來過濾掉垃圾

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個字符,但有時它們不會導致一些丟失數據並返回垃圾: - \

+0

這是什麼意思:「通常最後8個字符(?)在一起在最後」? – Franz 2009-11-18 23:00:59

+1

我可以問你爲什麼或如何進入這樣一個有問題的情況?誰把垃圾放在那裏,爲什麼? – 2011-04-28 13:56:49

回答

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); 
+0

其他字符如冒號或斜槓怎麼辦? – Aistina 2009-11-18 23:18:35

+0

啊,帖子已被編輯。我會很快更新。 – Dereleased 2009-11-18 23:22:30

+0

謝謝!我不完全確定那個正則表達式的作用,但是一個示例輸入的輸出是4Z56M9NQ9GP215,它比8個字符長,因爲垃圾也可以包含所有這些字符。基本上我需要在[垃圾]之間捨棄(有希望的)最後一個'='符號 – Mala 2009-11-18 23:26:22

0

這些值代表什麼?如果你想保留所有這些,就不必處理數據庫中的垃圾,也許你應該使用bin2hex()對它進行十六進制編碼。

+0

我基本上得到一個垃圾混合在一個字符串以不可預知的間隔,我想獲得原始字符串。我不認爲bin2hex()會對我有所幫助 – Mala 2009-11-18 23:16:44

1

如上所述,問題是無法解決的。如果垃圾可以包含「普通舊常規字符」字符,並且垃圾可能會落在字符串的末尾,則無法知道此示例中的目標字符串是「ABCDEFGH」還是「BCDEFGHI」:

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

它是無法解決的,但最好的近似值是沿着以下方向的:從後面收集儘可能合理;只要看起來合理,從「東西=」前方收集;如果第一部分大於等於8個字符,則使用該字符,否則從第二部分中取出儘可能多的字符,以填充至8個字符 – Mala 2009-11-18 23:33:08

+0

+1。但另一方面,模棱兩可的情況可能是少數。如果您可以在90%的時間內識別出正確的URL,那可能還是值得的。 – 2009-11-18 23:34:20

+0

這是「看起來很合理」,我遇到了 – Mala 2009-11-18 23:34:50

0

您可以使用正則表達式:

如果(的preg_match( '/ \'?^£$%& *()} {@#〜> <> | = _ +¬ - ] /」, $ string)== 1)

+1

問題請問您能詳細解釋一下您的答案,並添加關於您提供的解決方案的更多描述? – abarisone 2015-05-13 11:19:43