substring max 25 chars,如果匹配模式,则保持字符串的结尾

时间:2013-11-17 18:50:38

标签: php regex substring

我有一个字符串可以是这样的:

$string = 'namestring';

或者     $ string ='namestring_1';

Namestring可以是所有内容,可以跟随或不跟下划线+数字。

我需要检查字符串长度是否多于25个字符,如果它是截断,则仅保留下划线+数字的名称字符串部分,如果有,则总长度为25个字符。

示例:

$string ='012345678901234567890123456789_6';
$string2 ='012345678901234567890123456789';

必须改变:

$string ='01234567890123456789012_6';
$string2 ='0123456789012345678901234';

你能帮我吗?

编辑: 对不起......我没想过要指定它。不一定只有一个数字,即使它在下划线之后是两位数也是非常罕见的。

4 个答案:

答案 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));

无论输入是什么,这都有效。

<强>输出

  • $ string =“01234567890123456789012_6”
  • $ string2 =“0123456789012345678901234”
  • $ string3 =“0123456_78901234567890123”

答案 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位数的数字,那么我的工作就会起作用:)