我需要一个正则表达式来去除字符串中的外部/顶级 HTML 标记,但保留内部标记。
$str = "<div>Start <br /> <span>test</span> end.</div>";
进入
$str = "Start <br /> <span>test</span> end.";
还有
$str = "<aside id="main" class="one">Start <br /> <span>test</span> end.</aside>";
进入
$str = "Start <br /> <span>test</span> end.";
.
preg_replace('/<[^>]*>/', '', $str);
删除所有标签,而不仅仅是外部标签。
最佳答案
请注意
使用正则表达式并不是修改 HTML 代码的最佳方式! 在大多数情况下,使用 DOMDocument 或 DOMDocumentFragement 对象从 HTML 代码修改或提取数据会更好也更可靠。
但是,在某些情况下,正则表达式更好,主要是在这些因素适用的情况下:
- 您知道您编辑的 HTML 代码将有效。
- 修改后的 HTML 结构在所有情况下都是相同的。
- 您只需对代码进行非常简单的更改。
- 性能很重要(例如,当它在循环内执行时)。 DOMDocument 比简单的正则表达式慢得多!
代码
要从某些 HTML 代码中去除最外层的标签,请使用此正则表达式:
/* Note:
* The code must start with an opening tag and end with a closing tag.
* No white space or other text must be present before the first
* tag/after the last tag, else you get some unexpected results.
*/
$contents = preg_replace( '/^<[^>]+>|<\/[^>]+>$/', '', $markup );
// ^<[^>]+> This removes the first tag
// <\/[^>]+>$ This removes the last closing tag
示例
此正则表达式适用于大多数 HTML 标记,例如
In: '<div class="my-text" id="text" style="color:red">some text</div>'
Out: 'some text' (expected result)
当第一个标签包含“>”字符时,它将破坏所有内容,例如
In: '<div title="Home > Archives">Archive overview</div>'
Out: ' Archives">Archive overview' (unexpected result)
开头或结尾的空格/文本也会破坏正则表达式
In: '<div>Your name</div>:'
Out: 'Your name</div>:' (unexpected result)
当然,任何标签都将被剥离,没有任何健全性检查,例如
In: '<h2>Settings</h2><label>Page Title</label>'
Out: 'Settings</h2><label>Page Title' (unexpected result)
关于php - 正则表达式去除字符串中的外部 HTML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28670888/