RegEx处理字母数字输入 - PHP

时间:2011-09-13 06:21:36

标签: php regex

我有这个代码。

<?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

2 个答案:

答案 0 :(得分:4)

\d只包含数字。

您可以尝试\w而不是字母数字,但此外它还包括_

要成为Unicode,您可以选择

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

\pL是一个Unicode代码点,其属性为“Letter”

最后的u打开了使用此功能所需的UTF-8模式

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

其他解决方案

我认为你这样做有点复杂。如果您使用捕获组,那将会更简单。

试试这个:

$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中。

有关preg_match_all

的详细信息,请参阅here

答案 1 :(得分:2)

使用简单的preg_replace:

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

<强>输出:

DIG.111,148