удаление новых строк, кроме <pre> - PullRequest
2 голосов
/ 14 сентября 2009

Я хочу удалить новые строки из некоторых html (с php), за исключением тегов

, где пробел явно важен. 

Ответы [ 3 ]

7 голосов
/ 03 мая 2012

Это может произойти через 3 года, но ... Следующий код удалит все разрывы строк и пробелы, если он находится вне пред тегов. Ура!

<code>function sanitize_output($buffer)
{
    $search = array(
        '/\>[^\S ]+/s', //strip whitespaces after tags, except space
        '/[^\S ]+\</s', //strip whitespaces before tags, except space
        '/(\s)+/s'  // shorten multiple whitespace sequences
        );
    $replace = array(
        '>',
        '<',
        '\\1'
        );

    $blocks = preg_split('/(<\/?pre[^>]*>)/', $buffer, null, PREG_SPLIT_DELIM_CAPTURE);
    $buffer = '';
    foreach($blocks as $i => $block)
    {
      if($i % 4 == 2)
        $buffer .= $block; //break out <pre>...
с \ n's еще $ buffer. = preg_replace ($ search, $ replace, $ block); } вернуть $ буфер; } ob_start ( "sanitize_output");
1 голос
/ 14 сентября 2009

Разделить содержимое вверх. Это легко сделать с помощью ...

$blocks = preg_split('/<(|\/)pre>/', $html);

Только будьте осторожны, потому что элементы $ blocks не будут содержать тегов предварительного открытия и закрытия. Я считаю, что предположить, что HTML-код допустим, приемлемо, и поэтому вы можете ожидать, что предварительные блоки будут любыми другими элементами массива (1, 3, 5, ...). Легко тестируется с $i % 2 == 1.

Пример "завершенного" скрипта (измените, как вам нужно) ...

<code><?php
//out example HTML file - could just as easily be a read in file
$html = <<<EOF
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <h1>Title</h1>
    <p>
      This is an article about...
    </p>
    <pre>
      line one
      line two
      line three
    
случайный
EOF; // разбить все на части ... $ blocks = preg_split ('/ <(| \ /) pre> /', $ html); // и снова сложить все вместе $ html = ""; // повторно использовать в качестве нашего буфера foreach ($ блоков как $ i => $ блок) { если ($ i% 2 == 1) $ html. = "\ n
$block
\ n"; // разрываемся
...
с \ n еще $ html. = str_replace (array ("\ n", "\ r"), "", $ block, $ c); } echo $ html; ?>
1 голос
/ 14 сентября 2009

Если html правильно сформирован, вы можете положиться на тот факт, что теги <pre> не могут быть вложенными. Сделайте два прохода: сначала вы разбиваете входные данные на блоки предварительных тегов и все остальное. Вы можете использовать регулярное выражение для этой задачи. Затем вы удаляете новые строки из каждого не-предварительного блока и, наконец, соединяете их все вместе.

Обратите внимание, что большинство html плохо сформированы, поэтому у этого подхода могут быть некоторые ограничения на область его использования.

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