Я ищу лучшую функцию br2nl
. Я хотел бы заменить все экземпляры
и <br>
новыми символами <br />
\n
. Очень похоже на функцию nl2br (), но наоборот.
Я знаю, что в комментариях к PHP есть несколько решений, но я ищу отзывы от сообщества SO о возможных решениях.
Обычно я бы сказал « не использовать регулярное выражение для работы с HTML », но в этом случае я, вероятно, поеду с регулярным выражением, учитывая, что теги в целом выглядят так:
<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 Вы должны использовать константу PHP_EOL
чтобы иметь независимые от новой строки.
По-моему, использование функций без регулярного выражения по возможности делает код более читаемым.
$newlineTags = array( '<br>', '<br/>', '<br />', ); $html = str_replace($newlineTags, PHP_EOL, $html));
Я знаю, что это решение имеет некоторые недостатки, но мне хотелось бы поделиться своими соображениями.
Если документ хорошо сформирован (или, по крайней мере, правильно сформирован), вы можете использовать расширение 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();
Из комментариев nl2br :
<?php function br2nl($string){ $return=eregi_replace('<br[[:space:]]*/?'. '[[:space:]]*>',chr(13).chr(10),$string); return $return; } ?>