如何用正则表达式替换新行

时间:2010-08-21 07:35:23

标签: php regex replace

你可以帮我替换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 个答案:

答案 0 :(得分:4)

首先, str_replace() (您在原始问题中引用)用于查找文字字符串并替换它。 preg_replace() 用于查找与正则表达式匹配的内容并替换它。

在下面的代码示例中,我使用\s+查找一个或多个空格(新行,制表符,空格...)。 \s is whitespace+修饰符表示前一个或多个。

<?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);
?>

Live Example

答案 1 :(得分:0)

我发现拥有巨大的HTML字符串很奇怪,然后使用一些字符串搜索并替换hack来格式化后来......

使用PHP构建HTML时,我喜欢使用数组:

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

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

这样,每个HTML行都有单独的$ htmlArr []值。此外,如果你需要你的HTML“漂亮的打印”,你可以简单地使用某种方法,通过在每个数组元素的开头添加空格取决于索姆规则集来缩进HTML。例如,如果我们有:

$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

** 更新 **

在Felix Kling编辑问题之后,我意识到这与这个问题无关。对不起:)谢谢澄清。