Уберите метки, но не те, которые внутри <code> - PullRequest
1 голос
/ 19 мая 2010

Я видел некоторые решения или, по крайней мере, пробовал, но ни одно из них действительно не работает.

Как мне удалить все теги, кроме тех, которые находятся внутри <code> или [code] - и заменить все < и > на &lt; и т. Д., Чтобы позволить JavaScript делать некоторую подсветку синтаксиса в выходных данных?

Ответы [ 6 ]

0 голосов
/ 20 мая 2010

Ну, я много пробовал со всем вашим кодом, сейчас я работаю с этим, но он все еще не дает ожидаемых результатов - То, что я хочу, это обычная текстовая область, где можно поместить обычный текст, нажать клавишу ввода, ввести новую строку, не допуская теги здесь - возможно, <strong> или <b> .... Идеально было бы распознавать ссылки и окружать их <a> тегами

Этот текст должен автоматически иметь <p> и <br />, где это необходимо.

Для заполнения кода на разных языках необходимо набрать [code lang=xxx] код [/code] - в лучшем случае [code lang="xxx"] или <code lang=xxx> тоже будет работать. Чем набрать код или скопировать и вставить его внутрь.

Код, который я сейчас использую, по крайней мере, выполняет изменение тегов и выводит их корректно, кроме вкладок и переносов строк:

public function formatForDisplay( $output ){
    $output = preg_replace_callback( '#\[code lang=(php|js|css|html)]((?:[^[]|\[(?!/?code])|(?R))+)\[/code]#', array($this,'replaceWithValues'), $output );
    return strip_tags($output,'<code>');
}

public function replaceWithValues( $matches ){
    return '<code class="'.$matches[ 1 ].'">'.htmlentities( $matches[ 2 ] ).'</code>';
}

Похоже, что здесь работает.

0 голосов
/ 19 мая 2010
    $str = '[code]
        <script type="text/javascript" charset="utf-8">
            var foo = "bar";
        </script>
        [/code]
        <a href="should get removed">strip me</a>';

echo formatForDisplay( $str );

function formatForDisplay( $output ){
    $output = preg_replace_callback( '#\[code]((?:[^[]|\[(?!/?code])|(?R))+)\[/code]#', 'replaceWithValues', $output );
    return strip_tags($output);
}

function replaceWithValues( $matches ){
    return htmlentities( $matches[ 1 ] );
}

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

0 голосов
/ 19 мая 2010

Использовать обратный вызов:

$code = 'code: <p>[code]<hi>sss</hi>[/code]</p> more code: <p>[code]<b>sadf</b>[/code]</p>';

function codeFormat($matches)
{
    return htmlspecialchars($matches[0]);
}

echo preg_replace_callback('@\[code\](?:(?!\[/code\]).)*\[/code\]@',  'codeFormat', $code);
0 голосов
/ 19 мая 2010
<?php
$str = '<b><code><b><a></a></b></code></b><code>asdsadas</code>';
$str = str_replace('[code]', '<code>', $str);
$str = str_replace('[/code]', '</code>', $str);
preg_match('/<code>(.*?)<\/code>/', $str, $matches);
$str = strip_tags($str, "<code>");

foreach($matches as $match)
{
    $str = preg_replace('/<code><\/code>/', $str, '<code>'.htmlspecialchars($match).'</code>', 1);
}
echo $str;
?>

Это ищет теги кода и захватывает то, что находится внутри тегов. Удаляет теги. Перебирает совпадения, заменяя теги кода захваченным текстом и заменяя <и>.

РЕДАКТИРОВАТЬ: две строки str_replace добавлены, чтобы разрешить [код] тоже.

0 голосов
/ 19 мая 2010

Почему бы вам не попробовать использовать strpos () , чтобы получить позицию [code] и [/code].

Когда у вас есть местоположение (при условии, что у вас есть только один набор кодовых тегов), просто получите содержимое всего до и всего после, а также strip_tags в этом тексте.

Надеюсь, это поможет.

0 голосов
/ 19 мая 2010

Синтаксис strip_tag дает вам возможность определить допустимые теги: string strip_tags ( string $str [, string $allowable_tags ] ) -> из руководства по PHP.

Это должно дать вам старт в правильном направлении, я надеюсь.

...