preg_replace 将最终结果放错地方

preg_replace putting the final result in the wrong place

所以我在 preg_replace 正常工作时遇到了问题。我正在尝试创建自己的自定义 markdown。我得到了我想要的结果,因为它似乎吐出了我想要的东西。但是,问题在于它会将用户输入吐出到块引用之外。这是我正在谈论的一个例子。

这是我的代码。

<?php
$user_input = '> My quote';

$syntax = array(
    '/>\s+(.*?)/is'
);

$replace_with_html = array(
    '<blockquote><h3>Quote</h3><p></p></blockquote>'
);

$replaced = preg_replace($syntax, $replace_with_html, $user_input);

print($replaced);

这是用户输入。

> My quote

这是结果。

<blockquote><h3>Quote</h3><p></p></blockquote>My quote

我要的是

<blockquote><h3>Quote</h3><p>My quote</p></blockquote>

如您所见,用户输入的位置错误(在最终 HTML 代码的末尾)。有没有办法解决这个问题并将其放在段落标签中?

你不需要制作数组,使用这个:

$user_input = '> My quote';

$syntax = '/>\s+(.*)/s';

$replace_with_html = '<blockquote><h3>Quote</h3><p></p></blockquote>';

$replaced = preg_replace($syntax, $replace_with_html, $user_input);

print($replaced);

其工作方式相同:(Demo)

$user_input = '> My quote';

$syntax = ['/>\s+(.*)/s'];

$replace_with_html = ['<blockquote><h3>Quote</h3><p></p></blockquote>'];

$replaced = preg_replace($syntax, $replace_with_html, $user_input);

print($replaced);

无论哪种方式,您都希望模式中的点 贪婪,删除 ?.

如果不进行此调整,您只是替换了模式的 >\s+ 部分。


话虽如此,让我解决一些你还没有遇到的问题...

  1. 你怎么知道在哪里停止引用?
  2. 如果有人想用>来表示"greater than"怎么办?

考虑这种新模式以及它如何帮助您应对未来的一些挑战:

/^>\s+(\S+(?:\s\S+)*)/m Replacement Demo

在演示 link 中,您将看到该模式将匹配(在 > 和 1 个或多个空格之后)一个或多个非空白字符,可选地后跟:单个空白字符 (这可以是 space/tab/return/newline) 然后是一个或多个非空白字符。

这实际上是说,您想继续匹配 "quote" 文本,直到有 2 个或更多连续的空白字符(或者直到字符串末尾)。

此调整应该让您的用户能够accurately/conveniently引用格式化他们的文本,同时适当地留下无辜的>字符。