2

我有这个函数(我在 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 ('\"', "&quot;", $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>

它工作得很好,但有一个问题:它包装了 HTML 标签,这些标签紧跟<p>在其他<p>标签中的标签之后,搞砸了代码。<h1>如果 HTML 标记在一个或任何其他块标记之后,则不会发生这种情况。

使双倍preg_replace单一个解决了这个问题,但是如果像前面的例子一样有两个段落,它只包装第一个而不是第二个。

我觉得这只是一个很小的变化,可以让它“滴答作响”,但我无法弄清楚。

也许如果有人有天才的罢工...... :)

4

1 回答 1

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,因此这将不再匹配。当然,删除 double preg_replace

希望这可以帮助。

于 2012-07-17T15:42:31.237 回答