PHP 正则表达式以匹配 HTML 标签名称,某些标签除外

PHP regex to match HTML tag names except some tags

我正在尝试使用 PHP 中的正则表达式匹配任何打开的 HTML 标签,但 input 标签除外。这是我的模式。

/<([a-z]+)([^>]*>)?/i

符合以下所有条件:

<input type="text">
<img src=">
<a href="">
<button type="button"></button>
<div id="some"></div>
<p></p>

我不想匹配 input。正如我在问题标题中所述 some tags 一样,我将来可能会排除更多标签。

What I've tried so far

[编辑]

根据我的示例,我还希望保留仅在匹配结果中返回的标签名称,例如 imgabuttondiv , p, 等等

<(?:(?!input)[^>])*>(?:<\/[^>]*>)?

尝试 this.See 演示。

https://www.regex101.com/r/fG5pZ8/13

$re = "/<(?:(?!input)[^>])*>(?:<\/[^>]*>)?/im";
$str = "<input type=\"text\">\n<img src=\">\n<a href=\"\">\n<button type=\"button\"></button>\n<div id=\"some\"></div>\n<p></p>";

preg_match_all($re, $str, $matches);

编辑:

使用

(?!<input)<([A-Z0-9a-z]+)([^>]*>)?

如果要单独保存标签。

https://www.regex101.com/r/fG5pZ8/16

使用 negative lookahead(?!input\b):

<(?!input\b)([\w]+)([^>]*>)?

要排除多个标签,请使用 (?!(?:tag1|tag2|tag3|...)\b)