【问题标题】:Regex only matching non-empty newlines正则表达式仅匹配非空换行符
【发布时间】:2021-03-05 12:33:19
【问题描述】:

我有一个文本区域,用户可以在其中输入如下文本:

**Title 1**
aaa
bbb
ccc

**Title 2**
xxx
yyy
zzz

我将其转换为以下结果:



标题 1

>啊啊
> bbb
> 抄送

标题 2
> xxx
> 年年
> zzz


所以:

  • 两个星号之间的所有内容都会转换为粗体文本
  • 每个新行都会在行前放置一个>

问题是结果被转换成这个:



标题 1

>啊啊
> bbb
> 抄送
>

标题 2
> xxx
> 年年
> zzz
>


空的新行也会得到>... 这不应该是这样。如何过滤掉所有空的新行?

测试代码:

<html>
    <style>
        .product-desc-section {
            text-transform: uppercase;
            font-weight: bold;
            font-size: 1em;
        }
    </style>
    <form method="post" action="">
        <textarea name="text"></textarea>
        <br><input type="submit" name="btnTest" value="test">
    </form>

    <?php 
        if (isset($_POST['btnTest'])) {
            $text = $_POST['text'];

            $text = preg_replace("/[\r\n]+/", "\n", $text);
            $text = preg_replace('#\*{2}(.*?)\*{2}#', "<br><br><span class='product-desc-section'>$1</span>", htmlspecialchars($text));
            $text = preg_replace('~[\r\n]+~', "<br><span class='new-line'>&gt;&nbsp;</span>", $text);

            echo "<pre>".$text."</pre>";
        }
    ?>
</html>

测试输入:

**Title 1**
a
b
c

**Title 2**
x
y
z

输出:



标题 1

>一个
> 乙
> c
>

标题 2
> x
> 是
> z


预期输出:



标题 1

>一个
> 乙
> c

标题 2
> x
> 是
> z


如何只在每个不为空的新行上放置一个&gt;-icon?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您在第一次替换调用中使用&lt;br&gt;

    一个选项可以匹配所有断言它不是直接跟在&lt;br&gt;之后的换行符

    $text = preg_replace('~[\r\n]+(?!<br>)~', "<br><span class='new-line'>&gt;&nbsp;</span>", $text);
    

    您也可以使用\R+ 代替[\r\n]+ 来匹配任何Unicode 换行符序列。

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      相关资源
      最近更新 更多