Смайлик Заменить в CDATA HTML-строки - PullRequest
3 голосов
/ 24 мая 2010

У меня есть простая проблема :( Мне нужно заменить текстовые смайлики соответствующим изображением смайлика. Хорошо ... это не очень сложно, но теперь мне нужно заменить только текстовые смайлики вне HTML-тегов.1001 *

Текст:

Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.

я хочу заменить ": /" изображением этого смайлика ...

хорошо, как это сделатьчто лучше?

Ответы [ 6 ]

2 голосов
/ 06 июня 2010

Я не буду пытаться создать какой-нибудь суперскрипт, но думаю об этом .... смайлики почти всегда окружены пробелами. Итак, замените ': /' на смайлик. Вы могли бы сказать «что насчет смайлика в конце предложения (где оно будет использоваться чаще всего)». Ну, просто проверьте наличие хотя бы одного пробела слева или справа от потенциального смайлика.

Использование вышеприведенных скриптов:

$smiley_array = array(
    ":) " => "<a href...>",
    " :)" => "<a href...>",
    ":/ " => "<a href...>",
    " :/" => "<a href...>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

Если вам не нужно вводить все дважды, вы можете сгенерировать массив из одного массива смайликов.

1 голос
/ 10 июня 2010

Используйте preg_replace с утверждением вида за спиной. Пример:

$smileys = array(
  ':/' => '<img src="..." alt=":/">'
);
foreach ($smileys as $smile => $img) {
  $text = preg_replace('@(?<!<[^<>]*)' . preg_quote($smile, '@') . '@',
                       $img, $text);
}

Регулярное выражение должно соответствовать только смайликам, которые не заключены в угловые скобки. Это может быть медленным, если у вас много ложных срабатываний.

1 голос
/ 07 июня 2010

Почему бы вам просто не попробовать использовать некоторые специальные символы вокруг вашего текста смайлика, как это может быть -: / - Это сделает ваш текст смайлика уникальным и легко узнаваемым

0 голосов
/ 04 июня 2010

Возможно излишнее количество (увеличен процессор / нагрузка), но безопасно на 99,99999999%:

<?php
$n = new DOMDocument();
$n->loadHTML('<p>Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.</p>');
$x = new DOMXPath($n);
$instances = $x->query('//text()[contains(.,\':/\')]');//or use '//*[child::text()]' for all textnodes
foreach($instances as $node){
    if($node instanceof DOMText && preg_match_all('/:\//',$node->wholeText,$matches,PREG_OFFSET_CAPTURE|PREG_SET_ORDER)){
            foreach($matches[0] as $match){
                    $newnode = $node->splitText($match[1]);
                    $newnode->replaceData(0,strlen($match[0]),'');
                    $img = $n->createElement('img');
                    $img->setAttribute('src','smily.gif');
                    $img = $newnode->parentNode->insertBefore($img,$newnode);
                    //var_dump($match);
            }
    }
}
var_dump($n->saveHTML());
?>

Но на самом деле вы не хотите делать это все так часто, за исключением одного раза, покажите много, если вы позволяетепользователи редактируют html (beit в wysiwyg или в противном случае, преобразование 'return' (img to text) намного легче. Вы можете расширить с помощью различных смайликов (одно регулярное выражение монстра, чтобы соответствовать им, или несколько меньших / strstr () для читабельности, и массив для смайлика в src (например, массив (': /' => 'frown.gif')) будет подходить.

0 голосов
/ 03 июня 2010

Вы можете использовать регулярное выражение или дополнительную небрежную версию вышеупомянутого:

$smiley_array = array(":)" => "<a href...>",
    ":(" => "<a href=....>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace("://", "%%QF%%", $str);
$str = str_replace($codes, $links, $str);
$str = str_replace("%%QF%%", "://", $str);

На самом деле, предполагая, что str_replace следует за сортировкой массива ... это должно работать:

$smiley_array = array("://" => "%%QF%%", ":)" => "<a href...>",
    ":(" => "<a href=....>", "%%QF%%" => "://");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);
0 голосов
/ 24 мая 2010

Я бы не знал о лучшем способе, только о том, как я бы это сделал.

Создайте массив, содержащий коды смайликов в качестве ключей и ссылку в качестве значения.Использование str_replace.Передайте как «needle» массив ключей (кодов смайликов) и как «replace» массив значений.

Например, предположим, что у вас есть что-то вроде этого:

$smiley_array = array(":)" => "<a href...>",
    ":(" => "<a href=....>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

РЕДАКТИРОВАТЬ: В случае, если это может случайно заменить другие экземпляры на смайлики, вы должны рассмотреть возможность использования регулярных выражений с preg_replace.Очевидно, preg_replace на медленнее, чем str_replace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...