我有这个函数(我在Stackoverflow中的某处找到)在输出的字符串中自动添加<p>
标记。
function autop ($string) {
// Define block tags
$block_tag_list = array ('address', 'applet', 'article', 'aside', 'audio', 'blockquote', 'button', 'canvas', 'center', 'command', 'data', 'datalist', 'dd', 'del', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'iframe', 'ins', 'isindex', 'li', 'map', 'menu', 'nav', 'noframes', 'noscript', 'object', 'ol', 'output', 'p', 'pre', 'progress', 'section', 'script', 'summary', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'ul', 'video');
$tags = '<' . implode ('[^>]*>|<', $block_tag_list) . '[^>]*>';
$pattern = <<<PATTERN
/
(\A|\\n\\n)(?!$tags) # Start of string or two linebreaks or anything but a block tag
(.+?) # Just about anything
(\Z|\\n\\n) # End of string or two line breaks
/isex
PATTERN;
$string = str_replace ("\r\n", "\n", $string);
$string = str_replace ("\r\t", "", $string);
$string = str_replace ("\n\t", "", $string);
$string = str_replace ("\t", "", $string);
$string = preg_replace ($pattern, "'\\1<p>' . nl2br ('\\2') . '</p>\\3'", $string);
$string = preg_replace ($pattern, "'\\1<p>' . nl2br ('\\2') . '</p>\\3'", $string);
$string = str_replace ('\"', """, $string);
return $string;
}
有这种类型的字符串:
<h1>Title</h1>
This will be wrapped in a p tag
This should be wrapped in a p tag too
输出
<h1>Title</h1>
<p>This will be wrapped in a p tag</p>
<p>This should be wrapped in a p tag too</p>
它工作正常,但是对于一个问题:它包装紧跟在其他<p>
标记中的<p>
标记之后的HTML标记,拧紧代码。如果HTML标记位于<h1>
或其他任何块标记之后,则不会发生这种情况。
使双preg_replace
单个解决问题,但如果之前的例子中有两个段落,它只包装第一个而不是第二个。
我觉得这只是一个小小的变化,可以让它“打勾”,但我无法弄明白。
也许如果某人有天才罢工......:)
答案 0 :(得分:1)
我不确定你是否会对你的解决方案感到满意,但你应该得到你想要做的事情(观看第5行中添加的?=
):
$pattern = <<<PATTERN
/
(\A|\\n\\n)(?!$tags) # Start of string or two linebreaks or anything but a block tag
(.+?) # Just about anything
(?=\Z|\\n\\n) # End of string or two line breaks
/isex
PATTERN;
如果没有这个,前一个边界\Z
将消耗下一个\A
,因此这将不再匹配。当然要删除双preg_replace
。
希望这有帮助。