我正在尝试附加<br/>
到所有不以 html 标记结尾的行,但我无法让它工作。
到目前为止我已经得到了这个,但它似乎根本不匹配(在 PHP 中)。
$message=preg_replace("/^(.*[^>])([\n\r])$/","\${1}<br/>\${2}",$message);
关于如何使其正常工作的任何想法?
我认为您需要m
正则表达式上的修饰符:
$message=preg_replace("/^(.*[^>])$/m", "$1<br/>\n", $message);
// ^
// Here
m
除了字符串的开始/结束之外,还创建和匹配行的开始/结束^
。
不需要。
另外,为什么要匹配所有行以将其放回 after ?$
[\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>';
?>
你可以使用这个:
$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 ..)
我发现它以某种方式起作用,请参阅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 />
如果没有以 HTML 标记结尾,则添加 <br />:</p>、</strong>、...
解释:
(?<!\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.