PHP MySQL форматирование текста - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть следующий код, который отлично работает для форматирования текста из таблицы SQL. Хотя, кажется, немного затянуто.

Он будет создавать абзацы из разрывов строк, но игнорировать теги заголовка и списка (не переносить их в тегах "p".

Может кто-нибудь увидеть очевидный способ сократить это?

<?php

function format_html($content)
 {
  $content = str_replace("<h1>\r\n", "<h1>", $content);
  $content = str_replace("</h1>\r\n", "</h1><p>", $content);
  $content = str_replace("<h2>\r\n", "<h2>", $content);
  $content = str_replace("</h2>\r\n", "</h2><p>", $content);
  $content = str_replace("<h3>\r\n", "<h3>", $content);
  $content = str_replace("</h3>\r\n", "</h3><p>", $content);
  $content = str_replace("<h4>\r\n", "<h4>", $content);
  $content = str_replace("</h4>\r\n", "</h4><p>", $content);
  $content = str_replace("<h5>\r\n", "<h5>", $content);
  $content = str_replace("</h5>\r\n", "</h5><p>", $content);
  $content = str_replace("<h6>\r\n", "<h6>", $content);
  $content = str_replace("</h6>\r\n", "</h6><p>", $content);
  $content = str_replace("<ul>\r\n", "<ul>", $content);
  $content = str_replace("</ul>\r\n", "</ul><p>", $content);
  $content = str_replace("<ol>\r\n", "<ol>", $content);
  $content = str_replace("</ol>\r\n", "</ol><p>", $content);
  $content = str_replace("<li>\r\n", "<li>", $content);
  $content = str_replace("</li>\r\n", "</li>", $content);
  $content = "<p>" . str_replace("\r\n", "</p><p>", $content);
  $content = str_replace("<p><h1>", "<h1>", $content);
  $content = str_replace("<p><h2>", "<h2>", $content);
  $content = str_replace("<p><h3>", "<h3>", $content);
  $content = str_replace("<p><h4>", "<h4>", $content);
  $content = str_replace("<p><h5>", "<h5>", $content);
  $content = str_replace("<p><h6>", "<h6>", $content);
  $content = str_replace("<p><ul>", "<ul>", $content);
  $content = str_replace("<p><ol>", "<ol>", $content);
  return $content;
 }

function format_html_end($content)
 {
  $content = str_replace("</h1></p>", "</h1>", $content);
  $content = str_replace("</h2></p>", "</h2>", $content);
  $content = str_replace("</h3></p>", "</h3>", $content);
  $content = str_replace("</h4></p>", "</h4>", $content);
  $content = str_replace("</h5></p>", "</h5>", $content);
  $content = str_replace("</h6></p>", "</h6>", $content);
  $content = str_replace("</ul></p>", "</ul>", $content);
  $content = str_replace("</ol></p>", "</ol>", $content);
  return $content;
 }

?>

<?php
$con = mysql_connect("localhost","username","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("db", $con);

$result = mysql_query("SELECT column FROM table WHERE id = '1'");

while($row = mysql_fetch_array($result))
  {
  $content = $row['column'];
  echo format_html_end(format_html("$content</p>"));
  }

mysql_close($con);
?>

Содержимое таблицы будет выглядеть примерно так ...

<h1>Header</h1>
ertertert
ertertertert
rhdfgh
dfghdfghdfgh
ddfgh
<ul>
<li>fdghdfghd</li>
<li>fghjfghj</li>
</ul>

Ответы [ 5 ]

3 голосов
/ 10 февраля 2012

Вероятно, должно быть на пересмотре кода не здесь, но ну хорошо:

str_replace принимает массивы, например:

<?php

function format_html($content)
 {
  $replace = array("<h1>\r\n","</h1>\r\n","<h2>\r\n",...);
  $with = array("<h1>","</h1>","<h2>\r\n",...);

  $content = str_replace($replace, $with, $content);
  return $content;
 }
2 голосов
/ 10 февраля 2012

Вы можете справиться почти со всем этим с помощью некоторых регулярных выражений:

$content = preg_replace("/<(h[1-6]|ul|ol)>\r\n/", "<$1>", $content);
$content = preg_replace("/<\/(h[1-6]|ul|ol)>\r\n/", "</$1><p>", $content);
$content = preg_replace("/<(\/?)li>\r\n/", "<$1li>", $content);
$content = preg_replace("/<p><(h[1-6]|ul|ol)>/", "<$1>", $content);
$content = preg_replace("/<\/(h[1-6]|ul|ol)><\/p>/", "</$1>", $content);

Хитрость в том, что при замене вы можете использовать захват и обратные ссылки. Так, например, первое регулярное выражение может соответствовать h1-h6, ul или ol, и во время замены $1 имеет значение того, с кем оно совпадало.

Следующая строка кода я бы оставил как есть, поскольку она не имеет ничего общего с другими регулярными выражениями и отлично работает.

$content = "<p>" . str_replace("\r\n", "</p><p>", $content);
0 голосов
/ 10 февраля 2012

Вы захотите сделать многочастное регулярное выражение.Вот кое-что, что может сработать, что я быстро реализовал.Это значительно сократит объем кода за счет использования сопоставления выражений.Замените "" ниже на "<. *>", Если это универсальные правила тегов.

$patterns = array();
$patterns[0] = '/(?<=<h[1-6]>)\r\n/'; // removes \r\n after the tag
$patterns[1] = '/<p>(?=<h[1-6]>)/'; // removes <p> if before the tag
echo preg_replace($patterns, '', $content);

Справка по preg_replace: http://www.php.net/manual/en/function.preg-replace.php

Смотрите вперед и смотрите назад: http://www.regular -expressions.info / refadv.html

0 голосов
/ 10 февраля 2012

Со многими из них вы можете сделать это:

$content = str_replace(PHP_EOL, "<p>", $content);
0 голосов
/ 10 февраля 2012

Я не понимаю, зачем вам все эти замены, но вы можете использовать массивы с str_replace

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