preg_replace将最终结果放在错误的位置

时间:2017-08-16 01:13:48

标签: php regex preg-replace

所以我遇到问题让preg_replace正常工作。我正在尝试创建自己的自定义markdown。我得到了我想要的结果,因为它似乎在咳嗽我想要的东西。然而,问题是它将用户输入吐出到blockquote之外。以下是我所谈论的一个例子。

这是我的代码。

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

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

$replace_with_html = array(
    '<blockquote><h3>Quote</h3><p>$1</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代码的末尾)。有没有办法可以解决这个问题并将其放在段落标签中?

1 个答案:

答案 0 :(得分:1)

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

$user_input = '> My quote';

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

$replace_with_html = '<blockquote><h3>Quote</h3><p>$1</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>$1</p></blockquote>'];

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

print($replaced);

无论哪种方式,您希望模式中的点为贪心,请移除?

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

那就是说,让我解决一些你还没有遇到过的问题......

  1. 你怎么知道在哪里停止报价?
  2. 如果有人想使用>表示“大于”,
  3. 会怎样?

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

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

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

    有效地说,你想继续匹配“引用”文本,直到有2个或更多连续的空白字符(或者到字符串的末尾)。

    此调整 应该让您的用户能够准确/方便地引用格式化文本,同时恰当地留下无辜的>字符。