我想从HTML字符串中删除所有内容(标记之间)。 如果没有编写复杂的正则表达式,有没有一种优雅的方法呢?
如果您愿意,我实际上正在寻找strip_tags()
所做的相反的。
建议?
答案 0 :(得分:7)
此解决方案使用正则表达式。我会让你决定它是否复杂。
$out = preg_replace("/(?<=^|>).*?(?=<|$)/s", "", $in);
让我们分解一下:
(?<=^|>)
:一个向后看。实际上没有匹配,但它仍然必须在那里。匹配字符串的开头(^
)或文字的>
。.*?
:匹配任何内容(s
修饰符使其包含换行符)。问号使它变得懒惰 - 它匹配尽可能少的字符。(?=<|$)
:前瞻。匹配文字<
或字符串结尾($
)。这被替换为任何内容(""
),以便删除>
和<
之间的所有内容。可以看到一个工作演示here。它不会保留空格,所以你最终得到一条超长线。
编辑:如果您知道您的输入将始终包含在HTML标签中,您可以让自己更简单,因为您不必考虑字符串的开头和结尾位:
$out = preg_replace("/>.*?</s", "><", $in);
此变体不适用于在开头或结尾包含文字的输入 - 例如Hello <b>World</b>!
将变为Hello<b></b>!
。