#php #strlen
#php #strlen
Вопрос:
Я пытаюсь удалить каждый третий символ (в примере точка), приведенный ниже, является моим лучшим предположением и близок к тому, что я получил, но я что-то упускаю, вероятно, незначительное. Также был бы этот метод (если бы я мог заставить его работать) лучше, чем совпадение регулярных выражений, удалить?
$arr = 'Ha.pp.yB.ir.th.da.y';
$strip = '';
for ($i = 1; $i < strlen($arr); $i = 2) {
$arr[$i] = $strip;
}
Ответ №1:
Один из способов, которым вы можете это сделать, это:
<?php
$oldString = 'Ha.pp.yB.ir.th.da.y';
$newString = "";
for ($i = 0; $i < strlen($oldString ); $i ) // loop the length of the string
{
if (($i 1) % 3 != 0) // skip every third letter
{
$newString .= $oldString[$i]; // build up the new string
}
}
// $newString is HappyBirthday
echo $newString;
?>
В качестве альтернативы может сработать функция explode (), если буква, которую вы пытаетесь удалить, всегда одна и та же.
Комментарии:
1. Спасибо за вашу помощь, особенно за комментарии, но результат, который я получаю с этим, является a.p.b.r.h.a. ?
2. Похоже, мой тест был немного не в порядке, сейчас я это исправил, и вы можете увидеть на ideone.com/da4dS
Ответ №2:
Это может сработать:
echo preg_replace('/(..)./', '$1', 'Ha.pp.yB.ir.th.da.y');
Чтобы сделать его универсальным:
echo preg_replace('/(.{2})./', '$1', $str);
где 2
в этом контексте означает, что вы сохраняете два символа, а затем отбрасываете следующий.
Комментарии:
1. preg_replace(‘/([A-Za-z]{2})./’, ‘$1’, $ str); было бы более безопасным
Ответ №3:
Способ сделать это:
$old = 'Ha.pp.yB.ir.th.da.y';
$arr = str_split($old); #break string into an array
#iterate over the array, but only do it over the characters which are a
#multiple of three (remember that arrays start with 0)
for ($i = 2; $i < count($arr); $i =2) {
#remove current array item
array_splice($arr, $i, 1);
}
$new = implode($arr); #join it back
Или с помощью регулярного выражения:
$old = 'Ha.pp.yB.ir.th.da.y';
$new = preg_replace('/(..)./', '$1', $old);
#selects any two characters followed by a dot character
#alternatively, if you know that the two characters are letters,
#change the regular expression to:
/(w{2})./
Ответ №4:
Я бы просто использовал array_map и функцию обратного вызова. Это выглядело бы примерно так:
function remove_third_char( $text ) {
return substr( $text, 0, 2 );
}
$text = 'Ha.pp.yB.ir.th.da.y';
$new_text = str_split( $text, 3 );
$new_text = array_map( "remove_third_char", $new_text );
// do whatever you want with new array