Единственная функция 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' => '********'

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

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

На длинном отрезке я также хочу удалить разрывы строк в текстовой области и заменить их на <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;
}

person Jesse Elser    schedule 25.07.2015    source источник
comment
str_replace принимает массивы.   -  person chris85    schedule 26.07.2015
comment
ваша пользовательская функция может содержать столько функций php, сколько необходимо   -  person    schedule 26.07.2015


Ответы (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.

person backend_dev_123    schedule 25.07.2015
comment
А разрывы строк? Это возможно включить? Я не уверен, когда вы впервые просмотрели мой вопрос, но я добавил правку кода, который я написал, и мне любопытно, правильно ли это сработает. - person Jesse Elser; 26.07.2015
comment
Я добавил его для редактирования. Прости за это. Я предполагал, что они никогда не изменятся или, по крайней мере, изменятся достаточно редко, чтобы их можно было жестко закодировать в функцию. - person backend_dev_123; 26.07.2015
comment
О, ты не хотел этого делать. Дай мне минуту. Я пропустил момент там на секунду. Я что-нибудь придумаю. - person backend_dev_123; 26.07.2015
comment
Мне нравится, куда вы идете, я проверил свое редактирование, и, похоже, оно не работает. Любые идеи, что я, возможно, сделал неправильно в моем? Я думал, что у меня это есть, но ошибки новичка :) - person Jesse Elser; 26.07.2015
comment
сек. Я понял, что основное отличие здесь заключается в изображении. Все остальное изменяется непосредственно значением ключа, поэтому мы хотим проверить изображение, а не наоборот. Таким образом, ваш массив всегда можно редактировать. И вам не нужно прописывать тег ‹img во все элементы массива, потому что это ужасно избыточно. - person backend_dev_123; 26.07.2015
comment
Ну, я планирую добавить к нему больше, чем просто это. Я настраиваю это для скрипта электронной почты HTML таким образом, если я вставлю <h1>, он преобразуется в <h1 style="InlineStylesForEmail"> - person Jesse Elser; 26.07.2015
comment
О, тогда да, вам просто нужна прямая замена. - person backend_dev_123; 26.07.2015
comment
Это одна из причин, по которой я был бы не против придерживаться того, что я пытаюсь написать, но код не работает. Мой почтовый скрипт дает сбой, поэтому я не думаю, что правильно возвращаю замененный текст. - person Jesse Elser; 26.07.2015
comment
У меня есть еще одна идея. Если вы не против дать мне еще несколько минут, учитывая ваши критерии. - person backend_dev_123; 26.07.2015
comment
Я просто пытаюсь найти что-то, что работает, и ваша помощь очень ценится. - person Jesse Elser; 26.07.2015
comment
Я только что заработал, но разрывы строк не работают. - person Jesse Elser; 26.07.2015
comment
Попробуйте эту функцию. Поначалу это может немного сбивать с толку, но это позволит вам не постоянно что-то менять и переписывать. Я могу ответить на вопросы, чтобы помочь вам понять, как работает массив. - person backend_dev_123; 26.07.2015

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);
person Samir    schedule 25.07.2015