(preg_match_all("/(.)\\1\\1\\1/",$t, $m)) не работает в utf-8

12
M
На сайте с 20.08.2004
Offline
376
1527

if (preg_match_all("/(.)\\1\\1\\1/",$t, $m)) не работает в utf-8 помогите пожалуйста найти аналог или что то сделать с preg_match_all что бы заставить ее работать с русскими (не важно какими) буквами в юникоде.

Если файл в кодировке cp1251 все работает отично, если в uft-8 - не работает.

Пробовал вставить

setlocale (LC_ALL, "ru_RU.UTF-8");
ini_set('mbstring.internal_encoding', 'UTF-8');
ini_set('mbstring.func_overload', 6);
ini_set('mbstring.http_input', 'auto');
ini_set('mbstring.encoding_translation', 0);

Не помогает.

Пример текста для теста

Урррррррааааааа dddd Новый Год!!!!!!!!!!

Буду признателен за ваши знания.

Спасибо.

отец сыночка, лапочки дочки и еще одного сыночка
[Удален]
#1

можно исходную строку и что из нее надо выдернуть? :)

M
На сайте с 20.08.2004
Offline
376
#2

Надо удалить ВСЕ буквы повторяющиеся больше 3х (или Х) раз.

например

Уррррррррррррррррррраааааааааааааааааа -> Урррааа
!!!!!!!!!!!!!!->!!!
............................ ->...

Miracle добавил 05.01.2010 в 12:22

в принципе я нашел как получить правильно масив всех таких повторений но теперь проблема с preg_replace. Но пока просто промолчу может кто-то предложит свое видение - дабы не направлять в неправильное русло.

Miracle добавил 05.01.2010 в 12:28

в принципе я нашел как получить правильно масив всех таких повторений но теперь проблема с preg_replace. Но пока просто промолчу может кто-то предложит свое видение - дабы не направлять в неправильное русло.

[Удален]
#3


<?
$text = preg_replace("#(.){3,}#u",'\1\1\1',$text);

такое чтото попробуйте

M
На сайте с 20.08.2004
Offline
376
#4

вот код который работает с кодрировкой сп1251

if (preg_match_all("/(.)\\1\\1\\1/u",$t, $m))
{
for ($i=0;$i<count($m[0]);$i++)
{
preg_replace($m[0][$i], $m[1][$i].$m[1][$i].$m[1][$i], $t, 1 );
}
}
[Удален]
#5

Miracle, простите, но ваш код - херня)

M
На сайте с 20.08.2004
Offline
376
#6

ваш код вывел !!!

Miracle добавил 05.01.2010 в 12:32

bearman:
Miracle, простите, но ваш код - херня)

вы просто не вьехали что и для чего надо, как разберетесь поймете что все правильно - хотя возможно не идеально :)

могу доказать :) что вы не учли и почему мой код именно такой.

[Удален]
#7
Miracle:
ваш код вывел !!!

правильно заработал или что?)

bearman добавил 05.01.2010 в 12:36

Miracle:
вы просто не вьехали что и для чего надо, как разберетесь поймете что все правильно - хотя возможно не идеально

могу доказать что вы не учли и почему мой код именно такой.

возможно не въехал. но реплейсить в фориче - имхо неразумно :)

bearman добавил 05.01.2010 в 12:37

preg_replace($m[0][$i], $m[1][$i].$m[1][$i].$m[1][$i], $t, 1 );

да еще и никуда не присваивая результат реплейса оО :)

может

$t = preg_replace($m[0][$i], $m[1][$i].$m[1][$i].$m[1][$i], $t, 1 );

надо было написать?

M
На сайте с 20.08.2004
Offline
376
#8
bearman:
$t = preg_replace($m[0][$i], $m[1][$i].$m[1][$i].$m[1][$i], $t, 1 );

я просто кучу раз всего менял это не дописал. но сути не меняет. я дебаггере сижу и watch все анализирую.

bearman:
но реплейсить в фориче

во первых у меня фор, а не форич тут второй не работает так надо.

предложите лучший вариант

bearman:
правильно заработал или что?)

я бы сказал не заработал вообще

вместо нужной стороки вывел просто (три восклицательных знака)

Miracle добавил 05.01.2010 в 13:06

ура сделал!

[Удален]
#9

интересная темка вообще то. я сделал 2мя методами, и мне было както не по себе узнать что предварительный анализ и тп сложнее получился чем одно рег выражение :-D

Time PREG ONLY: 0.143626928329. Result: Урррааа ddd Новый Год!!!
Time STRING ANALYSE: 2.65907096863. Result: Урррааа ddd Новый Год!!!


<?
header("Content-type: text/html; charset=utf-8");

function no_blondify($text, $max = 3)
{
$words = array();
for($i = 0; $i<mb_strlen($text,"UTF-8"); $i++)
{
$words[mb_substr($text, $i, 1, "UTF-8")]++;
}

$words = array_filter($words, create_function('$x', 'return $x > 3;'));
foreach($words as $char=>$count)
{
$text = preg_replace("#".preg_quote($char)."{".$max.",}#u",str_repeat($char,$max),$text);
}

return $text;
}

function no_blondify_preg($text, $max = 3)
{
return preg_replace('#(.)\1{'.($max-1).',}#u','\1\1\1',$text);
}

$cycles = 10000;

$start = microtime(true);
for($i=0; $i<$cycles; $i++)
{
$s = no_blondify_preg("Урррррррааааааа dddd Новый Год!!!!!!!!!! ");
}
echo "Time PREG ONLY: ".(microtime(true) - $start).". Result: $s";

echo "<hr>";

$start = microtime(true);
for($i=0; $i<$cycles; $i++)
{
$s = no_blondify("Урррррррааааааа dddd Новый Год!!!!!!!!!! ");
}
echo "Time STRING ANALYSE: ".(microtime(true) - $start).". Result: $s";

покажите ваше решение? сравним скорости :)

ewg777
На сайте с 04.06.2007
Offline
225
#10

Дуд, for($i = 0; $i<mb_strlen($text,"UTF-8"); $i++) так нельзя, если сравнивать по скорости. Регулярка здесь будет лучше.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий