我有一个像下面这样的字母数字字符串,
$string_1 = "a4nas60dj71wiena15sdl1131kg12b"
并希望将其更改为以下内容,
$string_2 = "a4NaS60dJ71wIeNa15Sdl1131Kg12B"
我该怎么做呢?我已经尝试了以下代码,但它不起作用。
$lenght = strlen($string_1);
for ( $i = 0; $i <= $length - 1; $i += 1) {
if ( $i % 2) {
$string_2[$i]=strtoupper($string_1[$i]);
}
else {
$string_2[$i]=$string_1[$i];
}
}
echo $string_2;
上面的代码打印出“Array”,因此肯定无法正常工作。
答案 0 :(得分:1)
顺便说一句,你的大写字符串有一个小错误:
$string_1: a4nas60dj71wiena15sdl1131kg12b
$string_2: a4NaS60dJ71wIeNa15Sdl1131Kg12B
^ should be capital so out of sync for rest of string
我会给你两种方法:
<?php
header('Content-Type: text/plain');
$string_1 = "a4nas60dj71wiena15sdl1131kg12b";
$string_2 = "a4NaS60dJ71wIeNa15Sdl1131Kg12B";
$letter_count = 0;
$result = '';
for ($i=0; $i<strlen($string_1); $i++) {
if (!preg_match('![a-zA-Z]!', $string_1[$i])) {
$result .= $string_1[$i];
} else if ($letter_count++ & 1) {
$result .= strtoupper($string_1[$i]);
} else {
$result .= $string_1[$i];
}
}
$result2 = preg_replace_callback('!([a-zA-Z]\d*)([a-zA-Z])!', 'convert_to_upper', $string_1);
function convert_to_upper($matches) {
return strtolower($matches[1]) . strtoupper($matches[2]);
}
echo "$string_1\n";
echo "$string_2\n";
echo "$result\n";
echo "$result2\n";
?>
注意:以上做了几个假设:
如果这些假设不正确,可以改变上述内容。
答案 1 :(得分:0)
字符串不是数组,并且您将$ string_2声明为数组...
尽管如此,你的代码将无法按预期工作,因为,你会忽略所有其他字母的情况,而忽略数字
尝试以下方法:
function altCaps($str) {
$lower = true;
$str2 = "";
for ($i=0;$len=strlen($str);$i<$len;++$i) {
$char = substr($str,$i,1);
if (is_numeric($char)) {
$str2 .= $char;
} else {
if ($lower) {
$str2 .= strtolower($char);
} else {
$str2 .= strtolower($char);
}
$lower = !$lower;
}
}
return $str2;
}
答案 2 :(得分:0)
你应该很高兴使用这个功能。只需调用 alternate('string here'); 即可完美运行。
这适用于字符串中包含的连字符,空格,句点等。
function alternate($string1)
{
$do_caps = false;
$string2 = '';
for ($i = 0; $i < strlen($string1); $i++)
{
$char = substr($string1, $i, 1);
if (stripos('abcdefghijklmnopqrstuvwxyz', $char) !== false)
{
if ($do_caps)
{
$char = strtoupper($char);
$do_caps = false;
}
else
{
$do_caps = true;
}
}
$string2 .= $char;
}
return $string2;
}