所以我遇到问题让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
代码的末尾)。有没有办法可以解决这个问题并将其放在段落标签中?
答案 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+
部分。
>
表示“大于”,考虑这种新模式以及它如何帮助您应对未来的挑战:
/^>\s+(\S+(?:\s\S+)*)/m
Replacement Demo
在演示链接中,您将看到模式将匹配(在>
和1个或更多空格之后)一个或多个非空白字符可选地后跟:单个空白字符(这可以是空格/ tab / return / newline)然后是一个或多个非空白字符。
有效地说,你想继续匹配“引用”文本,直到有2个或更多连续的空白字符(或者到字符串的末尾)。
此调整 应该让您的用户能够准确/方便地引用格式化文本,同时恰当地留下无辜的>
字符。