【问题标题】:How to replace <p><br></p> from end of string that contain whitespaces, linebreaks and tab jumps? Regex?如何从包含空格、换行符和制表符跳转的字符串末尾替换 <p><br></p>?正则表达式?
【发布时间】:2014-08-12 16:35:24
【问题描述】:

我认为自己仍然是 regex 的新手,并且面临以下挑战:

我的用户发布的内容末尾包含一个或多个“换行符”。这些“换行符”是&lt;p&gt;&lt;br&gt;&lt;/p&gt;,标签之间有不同数量的空白。有时,每个段落中有多个&lt;br&gt;。一些例子:

<p>

<br> 
</p>
<p>
     <br> 
</p>
<p><br> <br> 
</p>
<p>
 <br> 
</p>

如何从每段内容的末尾删除这些段落,同时删除包含的&lt;br&gt;s、空格、换行符和制表符?

【问题讨论】:

  • 使用\s* 匹配任何空白字符[\r\n\t\f ]
  • 我在任何示例中都没有看到&lt;br /&gt;,只有&lt;br&gt;
  • 甚至不要尝试正则表达式。请改用DOM
  • @ExplosionPills 感谢您的指出。更改了问题标题。
  • 试试&lt;p&gt;\s*&lt;br\s*\/?&gt;\s*&lt;\/p&gt;

标签: php regex


【解决方案1】:
<?php
$strings[] = 'foo<p>

<br> 
</p>';
$strings[] = 'foo<p>
     <br> 
</p>';
$strings[] = 'foo<p><br><br> 
</p>';
$strings[] = 'foo<p>
 <br> 
</p>';

foreach($strings as $string){
 // \s* matches any number of whitespace characters (" ", \t, \n, etc)
 // (?:...)+ matches one or more (without capturing the group)
 // $ forces match to only be made at the end of the string
 $string = preg_replace("/(?:<p>\s*(?:<br>\s*)+<\/p>\s*)+$/", "", $string);

 echo $string."\n---\n";
}

输出是:


---

---

---

---

【讨论】:

  • 谢谢!在我写字符串结尾时,是否需要添加+$?比如preg_replace("/&lt;p&gt;\s*&lt;br&gt;\s*&lt;\/p&gt;+$/", "", $string);,而&lt;/p&gt;结束标签后面没有字符,但有时用户最后连续写了两三遍&lt;p&gt; &lt;br&gt; &lt;p&gt;
  • 如果它们不是仅仅被\s 分隔,而是被\t 和/或\n 分隔怎么办?
  • @Ben \s* 匹配任何空白字符[\r\n\t\f ]
  • @EchtEinfachTV 我已经更新了我的答案以匹配&lt;p&gt;&lt;br&gt;&lt;/p&gt; 的多个实例。您实际上希望 (?: 在开头,)+ 在结尾匹配多个。 (?: 启动一个“非捕获”组(因此它不会被分配$#),) 关闭它,+ 寻找一个或多个。
  • 每个&lt;br&gt; 都在一个新行上。 (&lt;br&gt;\s*)+ 似乎适用于这种情况。谢谢一千!
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2016-11-12
  • 2016-02-27
相关资源
最近更新 更多