将html附加到不以html标记结尾的所有行

时间:2013-11-12 21:21:39

标签: php regex

我正在尝试将<br/>附加到所有不以html标记结尾的行,但我无法使其正常工作。

到目前为止我已经得到了这个,但它似乎根本没有匹配(在PHP中)。

$message=preg_replace("/^(.*[^>])([\n\r])$/","\${1}<br/>\${2}",$message);

有关如何使其正常工作的任何想法?

3 个答案:

答案 0 :(得分:1)

我认为你的正则表达式需要m修饰符:

$message=preg_replace("/^(.*[^>])$/m", "$1<br/>\n", $message);
//                                 ^
//                                Here
除了字符串的开头/结尾外,

m使^$匹配行的开头/结尾。
不需要[\n\r] 另外,为什么你想匹配所有的线路,只是把它放回去?

实际上就像

一样简单
$message = preg_replace ('/([^>])$/m', '$1<br />', $message);

示例代码:

<?php
  $message = "<strong>Hey</strong>
  you,
  No you don't have to go !";
  $output = preg_replace ('/([^>])$/m', '$1<br />', $message);
  echo '<pre>' . htmlentities($output) . '</pre>';
?>

答案 1 :(得分:0)

您可以使用:

$message = preg_replace('~(?<![\h>])\h*\R~', '<br/>', $message);

其中:

`\h` is for horizontal white spaces (space and tab)
`\R` is for newline
(?<!..) is a negative lookbehind (not preceded by ..)

答案 2 :(得分:0)

我发现这有点起作用,请参阅http://phpfiddle.org/main/code/259-vvp

<?php
//
$message0 = "You are OK.
<p>You are good,</p>
You are the universe.
<strong>Go to school</strong>
This is the end.
";

//
if(preg_match("/^WIN/i", PHP_OS))
{
  $message = preg_replace('#(?<!\w>)[\r]$#m', '<br />', $message0);
}
else
{
  $message = preg_replace('#(?<!\w>)$#m', '<br />', $message0);
}

echo "<textarea style=\"width: 700px; height: 90px;\">";
echo($message);
echo "</textarea>";

//
?>

给出:

You are OK.<br />
<p>You are good,</p>
You are the universe.<br />
<strong>Go to school</strong>
This is the end.<br /><br />

添加&lt; br /&gt;如果没有像HTML标签那样结束: &LT; / p&gt;,&lt; / strong&gt;,...

说明:

(?<!\w>): negative lookbehind, if a newline character is not preceded
   by a partial html close tag, \w word character + closing >, like a>, 1> for h1>, ...
[\r\n]*$: end by any newline character or not.
m: modifier for multiline mode.