【问题标题】:PHP strip_tags except certain charactersPHP strip_tags 除了某些字符
【发布时间】:2014-02-10 20:13:42
【问题描述】:

我在 PHP 中使用strip_tags 在回显数据时删除 HTML 标记。

我的字符串看起来像:

<br>
<br>
<br>
<br>
<br>
Test 1, Test2<br>
Test 3,<br>
<br>
<br>
<br>
<br>
<br>
Test 4<br>
Test 5<br>
<br>
Test 6 test 7

如何删除留下大间隙的&lt;br&gt; 标记,但保留行间隙之间的&lt;br&gt; 标记(例如Test 1, Test2&lt;br&gt;Test3 之间的标记)?

然后删除:

<br>
<br>
<br>
<br>
<br>

所以字符串最终看起来像:

Test 1, Test2<br>
Test 3,<br>
Test 4<br>
Test 5<br>
<br>
Test 6 test 7

【问题讨论】:

  • 预期结果是什么?
  • 所以,如果你试图用一个&lt;br&gt;替换n &lt;br&gt;s,其中n是任何大于一的数字,正则表达式替换会很好用。
  • 抱歉,在您发布的字符串中,Test2 和 Test3 之间没有“
    ”标签。所以你的目标是不是保留这些标签,而是添加它们?我建议您删除所有标签,然后使用 phps nl2br() 函数将换行符(仍然存在)替换为 &lt;br&gt; 标签。
  • 提示,我很懒 atm:foreach($DOMXPath-&gt;query('//br/preceding-sibling::br') as $br){$br-&gt;parentNode-&gt;removeChild($br);}.
  • 检查我更新的问题

标签: php html


【解决方案1】:

分两步执行此操作可能更简洁:

// remove <br> tags
$text = preg_replace('#^(<br[\\s]*(>|\/>)\s*){2,}$#im', '', $text);

// remove empty lines - from http://stackoverflow.com/a/709684/
$text = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", PHP_EOL, $text);

解释 - #^(&lt;br\s*(&gt;|\/&gt;)\s*){2,}$#im

  • ^ - 行首锚点
  • ( - 第一个捕获组
    • &lt;br - 文字字符&lt;,后接b,后接r
    • \s* - 任何空白字符,零次或多次
    • (&gt;|\/&gt;) - 交替 - 匹配 &lt;br&gt;&lt;br/&gt;
    • \s* - 后跟可选空格
  • ) - 第一个捕获组结束
  • {2,} - 匹配上一组,2 次或更多次
  • i - 匹配两种情况
  • m - 使模式分别匹配行

输出:

Test 1, Test2<br>
Test 3,<br>Test 4<br>
Test 5<br>
<br>
Test 6 test 7

Demo

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2013-01-05
    • 2020-02-27
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多