Единична 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