br2nl Tüm XHTML / HTML Hat PHP satırsonlarının ile Tatili değiştirin

3 Cevap php

Ben iyi br2nl fonksiyonu arıyorum. I <br> and <br /> with newlines \n tüm örneklerini değiştirmek istiyorum. Çok nl2br fonksiyon ancak tersi gibi.

Ben PHP kılavuzu yorumların çeşitli çözümleri vardır biliyorum ama olası çözümler üzerinde SO eden geribildirim için arıyorum.

3 Cevap

Ben genelde bu bir, ben muhtemelen <br> etiketler genellikle ya benzediğini düşünüyor, bir regex ile gitmek istiyorum, "don't use regex to work with HTML" derdim ama:

  • <br>
  • veya <br/>, önce boşluk herhangi bir sayı ile /


I suppose something like this would do the trick :

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

Birkaç not:

  • ile başlar <br
  • beyaz karakter herhangi bir sayıyla: \s*
  • seçime bağlı olarak, bir /, /?
  • ve son olarak, bir >
  • ve bu <BR> HTML geçerli olacağı gibi, bir harf duyarsız eşleşme kullanarak

Belge iyi biçimlendirilmiş (ya da en azından iyi oluşturulmuş-imsi) Eğer bir \ n metin düğümü bütün br öğeleri bulmak ve değiştirmek için DOM extension ve XPath'i kullanabilirsiniz.

$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();

baskılar

<!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: sadece tek bir yineleme ile kısa versiyonu

$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 yorumlardan:

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