Как заменить новые строки регулярными выражениями - PullRequest
0 голосов
/ 21 августа 2010

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

$var = "<p>some text</p><p>another text</p><p>more text</p>";
$search = array("</p>\s<p>");
$replace = array("</p><p>");
$var = str_replace($search,$replace,$var);

Мне нужно удалить каждую новую строку (\n), а не <br/>, между двумя абзацами.

Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 21 августа 2010

Для начала, str_replace() (на который вы ссылались в исходном вопросе) используется, чтобы найти буквенную строку и заменить ее. preg_replace() используется, чтобы найти что-то, совпадающее с регулярным выражением, и заменить его.

В следующем примере кода я использую \s+, чтобы найти одно или несколько вхождений пробела (новая строка, табуляция, пробел ...). \s - это пробел , а модификатор + означает один или несколько из предыдущих элементов.

<?php
  // Test string with white space and line breaks between paragraphs
$var = "<p>some text</p>    <p>another text</p>
<p>more text</p>";

  // Regex - Use ! as end holders, so that you don't have to escape the
  // forward slash in '</p>'. This regex looks for an end P then one or more (+)
  // whitespaces, then a begin P. i refers to case insensitive search.
$search = '!</p>\s+<p>!i';

  // We replace the matched regex with an end P followed by a begin P w no
  // whitespace in between.
$replace = '</p><p>';

  // echo to test or use '=' to store the results in a variable. 
  // preg_replace returns a string in this case.
echo preg_replace($search, $replace, $var);
?>

Живой пример

0 голосов
/ 21 августа 2010

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

При построении HTML с PHP мне нравится использовать массивы:

$htmlArr = array();
foreach ($dataSet as $index => $data) {
   $htmlArr[] = '<p>Line#'.$index.' : <span>' . $data . '</span></p>';
}

$html = implode("\n", $htmlArr);

Таким образом, каждая строка HTML имеет отдельное значение $ htmlArr []. Более того, если вам нужно, чтобы ваш HTML был «красивым шрифтом», вы можете просто иметь какой-то метод, который будет делать отступ для вашего HTML, добавляя пробелы в начале каждого элемента массива в зависимости от набора правил Somme. Например, если у нас есть:

$htmlArr = array(
  '<ol>',
  '<li>Item 1</li>',
  '<li><a href="#">Item 2</a></li>',
  '<li>Item 3</li>',
  '</ol>'
);

Тогда алгоритм функции форматирования будет (очень простой, учитывая, что HTML хорошо построен):

$indent = 0; // initial indent
foreach & $value in $array
   $open = count how many opened elements
   $closed = count how many closed elements
   $value = str_repeat(' ', $indent * TAB_SPACE) . $value;
   $indent += $open - $closed;  // next line's indent
end foreach

return $array

Тогда implode("\n", $array) для симпатичного HTML

** ОБНОВЛЕНИЕ **

После редактирования вопроса Феликсом Клингом я понимаю, что это не имеет никакого отношения к вопросу. Извините за это :) Спасибо, хотя за разъяснения.

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