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+
部分。
话虽如此,让我解决一些你还没有遇到的问题...
- 你怎么知道在哪里停止引用?
- 如果有人想用
>
来表示"greater than"怎么办?
考虑这种新模式以及它如何帮助您应对未来的一些挑战:
/^>\s+(\S+(?:\s\S+)*)/m
Replacement Demo
在演示 link 中,您将看到该模式将匹配(在 >
和 1 个或多个空格之后)一个或多个非空白字符,可选地后跟:单个空白字符 (这可以是 space/tab/return/newline) 然后是一个或多个非空白字符。
这实际上是说,您想继续匹配 "quote" 文本,直到有 2 个或更多连续的空白字符(或者直到字符串末尾)。
此调整应该让您的用户能够accurately/conveniently引用格式化他们的文本,同时适当地留下无辜的>
字符。
所以我在 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+
部分。
话虽如此,让我解决一些你还没有遇到的问题...
- 你怎么知道在哪里停止引用?
- 如果有人想用
>
来表示"greater than"怎么办?
考虑这种新模式以及它如何帮助您应对未来的一些挑战:
/^>\s+(\S+(?:\s\S+)*)/m
Replacement Demo
在演示 link 中,您将看到该模式将匹配(在 >
和 1 个或多个空格之后)一个或多个非空白字符,可选地后跟:单个空白字符 (这可以是 space/tab/return/newline) 然后是一个或多个非空白字符。
这实际上是说,您想继续匹配 "quote" 文本,直到有 2 个或更多连续的空白字符(或者直到字符串末尾)。
此调整应该让您的用户能够accurately/conveniently引用格式化他们的文本,同时适当地留下无辜的>
字符。