假设我有字符串..
UA30230983A012
FK903980232P00
如何获得A和P的str?我试图插入一个 - 在最后一个字母字符之前它并没有那么好。
我尝试了以下内容......
$var = strrpos($var, '/^[A-Z]+$/i', 0);
...但它总是返回false?
答案 0 :(得分:1)
<?php
$strings =
[
'UA30230983A012',
'FK903980232P00'
];
$hyphened = array_map(function($v) {
return preg_replace('/([A-Z]{1}[0-9]+)$/', '-$1', $v);
}, $strings);
var_export($hyphened);
输出:
array (
0 => 'UA30230983-A012',
1 => 'FK903980232-P00',
)
答案 1 :(得分:1)
如果你想要一个匹配的位置你可以使用函数preg_match
得到它,标志PREG_OFFSET_CAPTURE
返回匹配参数中的位置:
$subjects = ['UA30230983A012', 'FK903980232P00'];
foreach ($subjects as $subject) {
if ( preg_match('~.*\K[A-Z]~', $subject, $match, PREG_OFFSET_CAPTURE) )
echo $match[0][1], PHP_EOL;
}
该模式使用.*
的贪婪来获取字符串的最后一个字母。
\K
是一种在模式中开始匹配结果的简便方法。
在最后一个字母前插入连字符:
$result = preg_filter('~.*\K(?=[A-Z])~', '-', $subjects);
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用正则表达式在字符串中查找最新的非数字字符,但是当您或团队中的其他开发人员重新使用此代码并尝试记住它时,这可能不太容易阅读确实。用简单易读的基本PHP代码做什么呢?
<?php
$string = 'FK903980232P00';
$split = str_split($string);
$last_alpha_index = null;
foreach($split as $key => $char) {
if (is_numeric($char))
continue;
$last_alpha_index = $key;
}
array_splice($split, $last_alpha_index, 0, '-');
echo implode('', $split);
输出:
FK903980232-P00
向后翻阅字符串,直到我们达到非数字:
$add_hyphen = function($str) {
foreach(str_split(strrev($str)) as $k => $v)
if(!is_numeric($v))
return substr_replace($str, '-', -($k+1), 0);
};
echo $add_hyphen('UA30230983A012');
输出:
UA30230983-A012
答案 4 :(得分:0)
$strA ="UA30230983A012";
echo substr_replace($strA,'aA', strrpos($strA, 'A'), 1);
答案 5 :(得分:0)
正如KIKO软件在OP的评论中所说:
<?php
$strings =
[
'UA30230983A012',
'FK903980232P00'
];
$hyphened = array_map(function($v) {
$pos = strlen(rtrim($v,'1234567890'));
return substr_replace($v, '-', $pos-1, 0);
}, $strings);
var_export($hyphened);
输出:
array (
0 => 'UA30230983-A012',
1 => 'FK903980232-P00',
)