2011-09-13 107 views
3

我有這段代碼。RegEx處理字母數字輸入 - PHP

<?php 
    $USClass = "3/312"; 
    $USClass = preg_replace_callback('~[\d.]+/[\d.]+~', function ($matches) { 
    $parts = explode('/', $matches[0]); 
    return $parts[1] . ',' . $parts[0]; 
    }, $USClass); 
    echo $USClass; 
?> 

它打印312,3這是我想要的。

但是,如果我給出像D12/336這樣的輸入,那麼它不起作用。我想要它打印336,D12

我該怎麼辦?我的當前代碼不能處理這個字母數字有什麼問題?是因爲我用了\ d嗎?

編輯:

我希望它處理的輸入,這樣也

148/DIG.111

那麼輸出應該是DIG.111,148

回答

4

\d只包含數字。

你可以試試\w這實際上是字母,但另外還包括_

要統一,你可以去

~[\pL\d.]+/[\pL\d.]+~u 

\pL是Unicode代碼點與物業「信」

u在結束時打開使用此功能所需的UTF-8模式

http://www.php.net/manual/en/regexp.reference.unicode.php

其他解決方案

我想你AR E完成此操作有點複雜。如果你想利用捕獲組,那將更簡單。

嘗試這種情況:

$in = "148/DIG.111"; 
preg_match_all('~([\w.]+)/([\w.]+)~', $in, $matches); 
echo $matches[2][0] . ',' . $matches[1][0]; 

說明:

([\w.]+)/([\w.]+) 
^^^^^^^^ ^^^^^^^^ 
Group 1 Group 2 

由於匹配的子存儲陣列$matches在括號。

here的更多詳細信息preg_match_all

+0

太好了!此代碼有效! '<?php \t $ USClass =「148/DIG.111」; \t $ USClass = preg_replace_callback('〜[\ w。] +/[\ w。] +〜',function($ matches){ \t $ parts = explode('/',$ matches [0]); \t return $ parts [1]。','。$ parts [0]; \t},$ USClass); \t echo $ USClass; ?>' –

+0

@Bhavani Kannan我用Unicode解決方案更新了我的答案。我認爲'\ w'只會覆蓋ASCII字母。 – stema

+0

@Bhavani Kannan我用一個更好的解決方案再次更新了我的答案。 – stema

2

用一個簡單的preg_replace:

$USClass = "148/DIG.111"; 
$USClass = preg_replace('#(.+?)/(.+)#', "$2,$1", $USClass); 
echo $USClass; 

輸出:

DIG.111,148 
+0

+1以獲得更簡單的解決方案 – stema