[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Замена регуляркой чисел в тексте
kav1
Здравствуйте. Вроде есть такая вещь как preg_replace, так и не понял, как в моем случае сделать замену в тексте.

В тексте много чисел, и есть есть строки, начинающиеся на 5, и далее до 0 (то есть 59089 или 5898708 например), чтобы были они были заменены на XXX89 и XXXXXX8 соответсвенно. То есть все от 5 до 0 включительно заменяется на X.

Подскажите что ли как тут фунцкию заюзать)
Arh
Лови лисапед =)
$str = 'бла бла бла 56743089 абракадабра 2386 быдлокод 555408';
preg_match_all('/5\d+/',$str,$array);
if(isset($array['0']['0'])){
foreach ($array['0'] as $key => $int) {
$end = substr(strrchr($int, '0'), 1);
$array['1'][$key] = str_repeat('X',strlen(substr($int, 0, strpos($int,'0'.$end)+1))).$end;
}
$str = str_replace($array['0'], $array['1'], $str);
}
print_r($str);


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
Написал, перечитал и сам не понял что за нах)
в общем preg_match находим все числа начинающиеся на 5
если что то нашлось, разбираем массив того что нашли
end это то что после нуля, в примере это 89 и 8
потом находим то что до нуля, считаем сколько там чисел до нуля +1 (ноль тоже считаем), потом str_repeat генерирует столько X сколько нашли чисел (которые до нуля +1)
потом пишем это в другой массив
потом str_replace заменяет в строке найденные числа из массива ноль, на числа из массива один, который мы сбыдлокодили в цыкле

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Placido
Можно проще:
$string = 'то есть 59089 или 5898708 например';
echo preg_replace_callback(
'/\b5[5-90]*?0/',
function($match){
return str_repeat('X', strlen($match[0]));
},
$string);
kav1
Спасибо, уважаемые!

А как пробел обозначается в регулярке? /s ? А то что-то не выходит с пробелом
GET
mav1
Так и обозначается, как пробел, но еще:

\s - Пробельный символ (пробел, табуляция, перевод строки и т. п.).
\S - Любой символ, кроме пробельных.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
kav1
C пробелами разобрался, а как теперь сделать так, чтобы строка:


$string = 'то есть 59089 или 5898708 например';


в итоге приняла вид 'то есть XXX89 или XXXXXX08 например', а 'то есть XXX89 (59089) или XXXXXX8 (5898708) например' ?
Placido
$string = 'то есть 59089 или 5898708 например';
echo preg_replace_callback(
'/\b(5[5-90]*?0)(\d+)/',
function($match){
return str_repeat('X', strlen($match[1])) . $match[2] . ' (' . $match[0] . ')';
},
$string);

kav1
Placido, а что означает (\d+) и для чего юзается \b ?
Placido
\d+ - любая цифра, 1 раз и более
круглые скобки - группировка
\b - граница слова

Это самые основы регулярых выражений, и есть миллион источников, где можно об этом почитать. Лучший вариант - книга Дж. Фриддла "Регулярные выражения", но можно начать и отсюда.
Arh
Placido
бог регулярок =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.