Как заменить все разрывы строк XHTML / HTML (<br>) новыми строками? - PullRequest
38 голосов
/ 13 марта 2010

Я ищу лучшую br2nl функцию. Я хотел бы заменить все экземпляры <code><br> и <code><br /> на новые строки \n. Очень похоже на функцию nl2br () , но наоборот.

Я знаю, что в комментариях к руководству по PHP есть несколько решений, но я ищу отзывы сообщества SO о возможных решениях.

Ответы [ 4 ]

92 голосов
/ 13 марта 2010

Я бы вообще сказал: " не используйте регулярные выражения для работы с HTML ", но в этом случае я бы, вероятно, использовал регулярное выражение, учитывая, что теги <br> обычно выглядят так:

  • <br>
  • или <br/>, с любым количеством пробелов перед /


Я полагаю, что-то вроде этого поможет:

$html = 'this <br>is<br/>some<br />text <br    />!';
$nl = preg_replace('#<br\s*/?>#i', "\n", $html);
echo $nl;

Пара заметок:

  • начинается с <br
  • , за которым следует любое количество белых символов: \s*
  • опционально, /: /?
  • и, наконец, >
  • и это с использованием нечувствительного к регистру соответствия (#i), так как <BR> будет действительным в HTML
6 голосов
/ 25 августа 2014

Вы должны использовать PHP_EOL константу, чтобы иметь независимую от платформы новую строку.

По моему мнению, использование не-регулярных выражений функций, когда это возможно, делает код более читабельным.

$newlineTags = array(
  '<br>',
  '<br/>',
  '<br />',
);
$html = str_replace($newlineTags, PHP_EOL, $html));

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

1 голос
/ 13 марта 2010

Если документ правильно сформирован (или, по крайней мере, правильно сформирован), вы можете использовать расширение DOM и xpath, чтобы найти и заменить все элементы br текстовым узлом \ n.

$in = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>...</title></head><body>abc<br />def<p>ghi<br />jkl</p></body></html>';

$doc = new DOMDOcument;
$doc->loadhtml($in);
$xpath = new DOMXPath($doc);

$toBeReplaced = array();
foreach($xpath->query('//br') as $node) {
    $toBeReplaced[] = $node;
}

$linebreak = $doc->createTextNode("\n");
foreach($toBeReplaced as $node) {
    $node->parentNode->replaceChild($linebreak->cloneNode(), $node);
}

echo $doc->savehtml();

печать

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head><title>...</title></head>
<body>abc
def<p>ghi
jkl</p>
</body>
</html>

edit: более короткая версия с одной итерацией

$in = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>...</title></head><body>abc<br />def<p>ghi<br />jkl</p></body></html>';

$doc = new DOMDOcument;
$doc->loadhtml($in);
$xpath = new DOMXPath($doc);

$linebreak = $doc->createTextNode("\n");
foreach($xpath->query('//br') as $node) {
  $node->parentNode->removeChild($node);
}

echo $doc->savehtml();
0 голосов
/ 13 марта 2010

Из nl2br комментариев:

<?php
function br2nl($string){
  $return=eregi_replace('<br[[:space:]]*/?'.
    '[[:space:]]*>',chr(13).chr(10),$string);
  return $return;
}
?> 
...