1.截取前16位字符串可能有数字拼音和汉字
function extract_first_16_characters($str) {
preg_match('/^[\x{4e00}-\x{9fff}a-zA-Z0-9]{1,16}/u', $str, $match);
return $match[0];
}
$original_string = "这是123个字符测试,包括汉字、数字和字母";
$first_16_characters = extract_first_16_characters($original_string);
echo $first_16_characters;
在这个例子中,正则表达式 ^[\x{4e00}-\x{9fff}a-zA-Z0-9]{1,16} 做了以下事情:
^ 表示匹配字符串的开始。
\x{4e00}-\x{9fff} 是Unicode范围,涵盖了所有汉字。
[a-zA-Z0-9] 匹配字母和数字。
{1,16} 指定匹配1到16次上述字符类中的任何字符。
/u 标志用于启用Unicode模式,这样正则表达式就能正确处理多字节字符,如汉字。
这个函数会返回字符串中匹配的前16个字符单位,但请注意,它可能无法精确地在16个汉字之后停止,尤其是当字符串中混杂了非汉字字符时。如果字符串的前16个字符单位中包含了汉字,那么返回的结果可能会少于16个字节,因为它会按照字符单位而不是字节数来截取
2.截前16位字符串后的数据,可能有数字拼音和汉字
function extract_after_first_16_characters($str) {
// 使用正则表达式跳过前16个字符单位,然后匹配剩余部分
preg_match('/^[\x{4e00}-\x{9fff}a-zA-Z0-9]{0,16}([\x{4e00}-\x{9fff}a-zA-Z0-9].*)?/u', $str, $matches);
// 如果找到了匹配项,则返回第17个字符单位及之后的内容,否则返回空字符串
return isset($matches[1]) ? $matches[1] : '';
}
$original_string = "这是123个字符测试,包括汉字、数字和字母";
$remaining_string = extract_after_first_16_characters($original_string);
echo $remaining_string;
这段代码中,正则表达式做了如下操作:
^[\x{4e00}-\x{9fff}a-zA-Z0-9]{0,16} 首先尝试匹配从字符串开头起0到16个字符单位(包括汉字、字母和数字),目的是跳过这些字符。
([\x{4e00}-\x{9fff}a-zA-Z0-9].*)? 这部分是关键,它使用括号捕获从第17个字符单位开始直到字符串结束的所有内容。这里使用了一个非贪婪量词 .*,意味着它会尽可能少地匹配字符,以确保首先匹配的是从第17个字符单位开始的那一个。
如果字符串的前16个字符单位中包含了非汉字字符,这个方法同样适用,它会从第17个字符单位,无论它是汉字、数字还是字母,开始截取字符串。如果没有足够的字符单位(即字符串长度小于17个字符单位),函数将返回空字符串。