我有一个字符串可以是这样的:
$string = 'namestring';
或者 $ string ='namestring_1';
Namestring可以是所有内容,可以跟随或不跟下划线+数字。
我需要检查字符串长度是否多于25个字符,如果它是截断,则仅保留下划线+数字的名称字符串部分,如果有,则总长度为25个字符。
示例:
$string ='012345678901234567890123456789_6';
$string2 ='012345678901234567890123456789';
必须改变:
$string ='01234567890123456789012_6';
$string2 ='0123456789012345678901234';
你能帮我吗?
编辑: 对不起......我没想过要指定它。不一定只有一个数字,即使它在下划线之后是两位数也是非常罕见的。
答案 0 :(得分:0)
我认为如果只有一个数字可以跟在下划线之后,这可能是一个有效的解决方案。否则,您只需要对其进行修改,以便23变为25 - strlen($match[1])
。
if (preg_match('/(_\d)$/', $namestring, $match)) {
$namestring = substr(0, 23, $namestring) . $match[1];
} else {
$namestring = substr(0, 25);
}
答案 1 :(得分:0)
来自山区的丑陋的正则表达式解决方案(仅用下划线后的1位数字):
$result = preg_replace('~^.{23}\K(?(?!.*_\d$)(.{2})).*(_\d)?$~', '$1$2', $str);
模式细节:
我使用条件内部(IF ... THEN ...):(?(?!.*_\d$)(.{2}))
(? # IF
(?!.*_\d$) # (CONDITION): if there is not _\d at the end
(.{2}) # THEN: capture two other characters
) # ENDIF
或更好的分支重置(?|..|..)
:
$result = preg_replace('~^\d{23}\K(?|.*(_\d)|(.{2}).*)$~', '$1', $str);
答案 2 :(得分:0)
$string ='012345678901234567890123456789_6';
$string2 ='012345678901234567890123456789';
$string3 ='0123456_78901234567890123456789';
$c = explode("_", $string, 2);
$fixed = (count($c) > 1 ? (((strlen($c[0]) > 23) ? (substr($c[0],0,strlen($c[0]))) : substr((substr($c[0],0,23) . "_" . $c[1]),0,25))) : substr($c[0],0,25));
无论输入是什么,这都有效。
<强>输出强>
答案 3 :(得分:0)
为什么不使用substr()? 我将如何做到这一点:
$str= "67676767676767676766767675757675757575757575746655_2";
$pos = strpos($str,"_");
$end = substr($str, $pos-strlen($str));
$start = substr($str, 25-strlen($pos));
$your_string = $start.$end;
编辑:从所有4个答案中,如果你在_之后有一个2位数的数字,那么我的工作就会起作用:)