我有这个代码。
<?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
答案 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
答案 1 :(得分:2)
使用简单的preg_replace:
$USClass = "148/DIG.111";
$USClass = preg_replace('#(.+?)/(.+)#', "$2,$1", $USClass);
echo $USClass;
<强>输出:强>
DIG.111,148