2011-09-13 74 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