Проверить.. не повторяются ли элементы массива в строке

Сенсей

Новичок
Проверить.. не повторяются ли элементы массива в строке

PHP:
$this = array(':)',
	':biggrin:',
	':surprised:',
	':eek:',
	':conf:',
	':cool:',
	':lol:',
	':mad:',
	':razz:',
	':(',
	':oops:',
	':cry:',
	':evil:',
	':twisted:',
	':roll:',
	':wink:',
	':ex:',
	':quest:',
	':idea:',
	':arr:');
это список кодов смайлов... нужно ограничить против спама.. str_replace хороше работает.. но в версиях ниже 5 count не поддерживается... приходится придумыватьь способы от спама...

Правильно:
текс и смайл :conf: еще текст и смайл :conf: еще текст и два разных смайла :conf: :ex:

НЕ правильно:
текст и несколько ОДИНАКОВЫХ смайлов подряд :conf: :conf::conf::conf:

Нужно проверить не нарушается ли правило... и сообщить об этом юзеру...

Хочется сделать проверху как можно проще... но не догоняю что то...

первая идея это работать с циклами и строковыми функциями.. но как я думаю гиморой это...

вторая идея - preg_match
но - в регуляках почти ноль..
и - как я понял preg_match не умеет работать с массивом.. то есть придется проходиться по массиву... строить находу паттерн... и потом уже проверять строку на валидность...

Есть альтернативные способы? Какие идеи?
 

Andreika

"PHP for nubies" reader
1. не могу понять что в массиве смайлов делает HTML.. это тоже такие хитрые коды или как-то по другому задумано

2. с каких пор str_replace что-то проверять стал?

3. правильно/не правильно это не важно.. правило формализуй на русском языке, а потом будешь о регулярках думать

4. как по твоему работает str_replace(array)? волшебным образом все заменяет все элеметны массива за 1 проход?
 

Сенсей

Новичок
1 - это баг этого форума
2 - ни кто про проверять не говорил... но если бы там работал каунт - делал бы на нем... а так как он не пашет - хочу сделать проверку.. ибо выводить сообщения и пропуская через регулярки каждое - сильно жирно будет... пожтому надо сделать именно проверку...

4 - не понял к чему ты это...
 

Andreika

"PHP for nubies" reader
Сенсей
4, к "как я понял preg_match не умеет работать с массивом.. то есть придется проходиться по массиву... "
все равно кому-то прийдется проходить по массиву.. не тебе, так функции

3, ну дык? :) напиши какого вида у тебя смайлики (тока, чтобы форум их не портил) и какие правила замены (только без "например").
 

avenger_msoft

Новичок
Я делал вот так:

PHP:
$tmp = $message;
reset($Smileys);
foreach ($Smileys as $name => $value) {
         reset($value);
         foreach ($value as $n => $v) {
                  $message = str_replace($v, $name, $message);
                  $tmp     = str_replace($v, "@@SMILEY@@", $tmp);
         }
}

$matches = array();
preg_match_all("/@@SMILEY@@/", $tmp, $matches, PREG_PATTERN_ORDER);

if ( count($matches[0]) > 2 ) { // Количество смайликов больше 2-х
}
Здесь есть две переменные, в одной все смайлики приводятся к нужному виду ($message), а во второй ($tmp) смайлики заменяются на псевдосимвол "@@SMILEY@@", затем идет подсчет таких псевдосимволов. Вот и все!

С уважением, Иван.
 

sage

Новичок
Сенсей
попробуй вот это:
PHP:
var_dump(preg_match('#(?::conf:\s*?){2}#',':conf: еще текст и смайл :conf:')); // 0

var_dump(preg_match('#(?::conf:\s*?){2}#',':conf: :conf:')); // 1
 

Сенсей

Новичок
avenger_msoft
попробую... но чесно скажу не очень нравится этот способ..

sage
допустим работает.. но у меня кодов смайликов много....
с твоим примером я могу пробежаться по массиву $this а на каждый код по отдельности проверять $message

То есть если кодов у меня щас 19 - то это 19 раз вызов функции preg_match

Можно как то использовать твой паттерн для всех кодов одновременно?

То есть я пробегаю по масиву $this - составляю часть паттерна и вставляю в функию... как бы список кодов... что то типа

PHP:
preg_match('#(?:':)', 
    ':biggrin:', 
    ':surprised:', 
    ':eek:', 
    ':conf:', 
    ':cool:', 
    ':lol:', 
    ':mad:', 
    ':razz:', 
    ':(', 
    ':oops:', 
    ':cry:', 
    ':evil:', 
    ':twisted:', 
    ':roll:', 
    ':wink:', 
    ':ex:', 
    ':quest:', 
    ':idea:', 
    ':arr:'\s*?){2}#',':conf: еще текст и смайл :conf:')
а уже эта функция если встречает использование больше одного смайлика подряд с ОДИНАКОВЫМ кодом - давала бы мне фолс...
 

sage

Новичок
PHP:
$smiles = '(?:biggrin|surprised|eek|conf|cool|lol|mad|razz|oops|cry|evil|twisted|roll|wink|ex|quest|idea|arr)';

var_dump(preg_match('#(?::'.$smiles.':\s*?){2}#', ':conf:текст :conf:'));
смайлы в $smiles не все
 
Сверху