我有这个代码。
<?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,这是我想要的。
然而,如果我给出像D12/336这样的输入,那么它就不起作用了。我想让它打印336,D12
我该怎么做?我当前的代码不处理这个字母数字有什么问题?是因为我用了'd吗?
编辑:我希望它也能处理这样的输入
148/DIG.111
则输出应为DIG.111,148
是'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
使用一个简单的preg_replace:
$USClass = "148/DIG.111";
$USClass = preg_replace('#(.+?)/(.+)#', "$2,$1", $USClass);
echo $USClass;
输出:DIG.111,148