Как заменить все разрывы строки XHTML/HTML (<br>) новыми строками?

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

Я знаю, что существует несколько решений в ручных комментариях PHP, но я ищу обратную связь от ТАКИМ ОБРАЗОМ сообщество на возможных решениях.

38
задан kenorb 3 March 2015 в 00:16
поделиться

3 ответа

Обычно я бы сказал « не используйте регулярное выражение для работы с HTML », но в этом случае я, вероятно, выбрал бы регулярное выражение, учитывая, что
теги обычно выглядят так:


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


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

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

Пара примечаний:

  • начинается с
  • , за которым следует любое количество белых символов: \ s *
  • необязательно, a / : /?
  • и, наконец, >
  • , и это с использованием соответствия без учета регистра ( #i ), так как
    будет действительно в HTML
96
ответ дан 27 November 2019 в 03:11
поделиться

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

<?php
function br2nl($string){
  $return=eregi_replace('<br[[:space:]]*/?'.
    '[[:space:]]*>',chr(13).chr(10),$string);
  return $return;
}
?> 
0
ответ дан 27 November 2019 в 03:11
поделиться

Если документ хорошо сформирован (или хотя бы хорошо сформирован), вы можете использовать расширение 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();

prints

<!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: short version with only one iteration

$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();
1
ответ дан 27 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: