foreach — одна функция PHP для замены текста смайликами или фильтрацией слов

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

Я посмотрел на этот код:

$smiles = array(
'xD'  => 'devil.png',
'>:)' => 'devil.png',
'x('  => 'angry.png',
':((' => 'cry.png',
':*'  => 'kiss.png',
':))' => 'laugh.png',
':D'  => 'laugh.png',
':-D' => 'laugh.png',
':x'  => 'love.png',
'(:|' => 'sleepy.png',
':)'  => 'smile.png',
':-)' => 'smile.png',
':('  => 'sad.png',
':-(' => 'sad.png',
';)'  => 'wink.png',
';-)' => 'wink.png'
);

foreach($smiles as $key => $img) {
$msg = str_replace($key, '<img src="emotions/'.$img.'" height="18" width="18" />', $msg);
}
echo $msg;

Это кажется достаточно простым, но что, если я хочу добавить что-то вроде 'BadWord1' => '********'

Я знаю, как добавить его в этот скрипт, так как я просто добавил бы эту новую строку, но он попытался бы превратить его в изображение.

Можно ли написать функцию, которая бы заменяла текст и изображения?

На длинном отрезке я также хочу удалить разрывы строки textarea и заменить их на <br> вместо этого используя что-то вроде $val = str_replace( array("\n","\r","\r\n"), '<br />', $val );

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

Моя главная цель — когда отправляется текстовое поле для вызова текста функции replaceText($textareaText) и все в тексте, который нуждается в замене, заменяется.

Будут ли мне нужны отдельные функции?

Я собираюсь продолжать работать над этим самостоятельно, поэтому, если я придумаю какие-либо возможные события, я обновлю свой вопрос, чтобы включить его.

РЕДАКТИРОВАТЬ: Вот то, что я придумал. Вы считаете это достаточным?

function replaceText($msg) {
$replaceableText = array(
'xD'  => '<img src="emoticons/devil.png" height="18" width="18">',
'>:)' => '<img src="emoticons/devil.png" height="18" width="18">',
'x('  => '<img src="emoticons/angry.png" height="18" width="18">',
':((' => '<img src="emoticons/cry.png" height="18" width="18">',
':*'  => '<img src="emoticons/kiss.png" height="18" width="18">',
':))' => '<img src="emoticons/laugh.png" height="18" width="18">',
':D'  => '<img src="emoticons/laugh.png" height="18" width="18">',
':-D' => '<img src="emoticons/laugh.png" height="18" width="18">',
':x'  => '<img src="emoticons/love.png" height="18" width="18">',
'(:|' => '<img src="emoticons/sleepy.png" height="18" width="18">',
':)'  => '<img src="emoticons/smile.png" height="18" width="18">',
':-)' => '<img src="emoticons/smile.png" height="18" width="18">',
':('  => '<img src="emoticons/sad.png" height="18" width="18">',
':-(' => '<img src="emoticons/sad.png" height="18" width="18">',
';)'  => '<img src="emoticons/wink.png" height="18" width="18">',
';-)' => '<img src="emoticons/wink.png" height="18" width="18">',
'\n' => '<br>',
'\r' => '<br>',
'\r\n' => '<br>',
'\n\r' => '<br>',
'badword1' => '********',
'badword2' => '********'
);

foreach($replaceableText as $replace => $replacedWith) {
$msg = str_replace($replace, $replacedWith, $msg);
}
return $msg;
}

РЕДАКТИРОВАТЬ 2:

Я забыл упомянуть об этом ранее, но это для сценария электронной почты HTML.

Таким образом, я могу напечатать что-то простое, например: <h1> и он автоматически преобразуется в тег заголовка с предустановленными встроенными стилями.

Может быть, что-то вроде этого:

function replaceText($msg) {
$replaceableText = array(
'xD'  => '<img src="emoticons/devil.png" height="18" width="18">',
'>:)' => '<img src="emoticons/devil.png" height="18" width="18">',
'x('  => '<img src="emoticons/angry.png" height="18" width="18">',
':((' => '<img src="emoticons/cry.png" height="18" width="18">',
':*'  => '<img src="emoticons/kiss.png" height="18" width="18">',
':))' => '<img src="emoticons/laugh.png" height="18" width="18">',
':D'  => '<img src="emoticons/laugh.png" height="18" width="18">',
':-D' => '<img src="emoticons/laugh.png" height="18" width="18">',
':x'  => '<img src="emoticons/love.png" height="18" width="18">',
'(:|' => '<img src="emoticons/sleepy.png" height="18" width="18">',
':)'  => '<img src="emoticons/smile.png" height="18" width="18">',
':-)' => '<img src="emoticons/smile.png" height="18" width="18">',
':('  => '<img src="emoticons/sad.png" height="18" width="18">',
':-(' => '<img src="emoticons/sad.png" height="18" width="18">',
';)'  => '<img src="emoticons/wink.png" height="18" width="18">',
';-)' => '<img src="emoticons/wink.png" height="18" width="18">',
'\n' => '<br>',
'\r' => '<br>',
'\r\n' => '<br>',
'\n\r' => '<br>',
'badword1' => '********',
'badword2' => '********',
'<h1>' => '<h1 style="InlineStylesForHTMLEmail">'
);
foreach($replaceableText as $replace => $replacedWith) {
$msg = str_replace($replace, $replacedWith, $msg);
}
return $msg;
}

2

Решение

[править] извините, я не мог не сделать это так, как если бы это был мой проект. Повторяемый не избыточный процесс.

$array = [
'<img src="emoticons/{{value}}" height="18" width="18">' => [
':)' => 'smile.png',
';)' => 'wink.png'
],
'<br>' => ['\n', '\r'],
'****' => ['4lettercussword', '4lettercussword'],
'*****' => '5lettercussword'
];

function filterText($array, &$msg) {
foreach($array as $key => $value) {
if(is_array($value)) {
if(array_keys($value) !== range(0, count($value) - 1)) {
foreach($value as $k => $v) {
$msg = str_replace($k, str_replace('{{value}}', $v, $key), $msg);
}
} else {
for($i = 0;$i < count($value);$i++) {
$msg = str_replace($value[$i], $key, $msg);
}
}
} else {
$msg = str_replace($value, $key, $msg);
}
}
}

$msg = '4lettercussword :) \n';
filterText($array, $msg);
echo $msg;

выход:

**** <img src="emoticons/smile.png" height="18" width="18"> <br>

Ключ в массиве — это то, что заменит значение. Если ключ содержит идентификатор {{value}}, то он знает, что указанный массив будет ассоциативным, и что ему необходимо взять значение из этого массива и вставить его в идентификатор {{value}} в вашем ключе. Если какой-либо ключ равен простому массиву значений, он заменит любое из этих значений ключом. Это всегда для того, чтобы иметь разные html-теги и заменять только его части значением ключа str_replace.

1

Другие решения

nl2br вставит разрывы строк HTML перед всеми новыми строками в строке.

Вот мой фрагмент кода.

function replaceText($val)
{
$search = array(
'xD',
'>:)',
'x(',
':((',
':*',
':))',
':D',
':-D',
':x',
'(:|',
':)',
':-)',
':(',
':-(',
';)',
';-)',
'Badword1'
);

$replace = array(
'<img src="emotions/devil.png" height="18" width="18" />',
'<img src="emotions/devil.png" height="18" width="18" />',
'<img src="emotions/angry.png" height="18" width="18" />',
'<img src="emotions/cry.png" height="18" width="18" />',
'<img src="emotions/kiss.png" height="18" width="18" />',
'<img src="emotions/laugh.png" height="18" width="18" />',
'<img src="emotions/laugh.png" height="18" width="18" />',
'<img src="emotions/laugh.png" height="18" width="18" />',
'<img src="emotions/love.png" height="18" width="18" />',
'<img src="emotions/sleepy.png" height="18" width="18" />',
'<img src="emotions/smile.png" height="18" width="18" />',
'<img src="emotions/smile.png" height="18" width="18" />',
'<img src="emotions/sad.png" height="18" width="18" />',
'<img src="emotions/sad.png" height="18" width="18" />',
'<img src="emotions/wink.png" height="18" width="18" />',
'<img src="emotions/wink.png" height="18" width="18" />',
'********'
);
$val = str_replace( $search, $replace, $val );
$val = nl2br($val);
return $val;
}

replaceText($textareaText);
1

По вопросам рекламы [email protected]