PHP正则表达式匹配HTML标记名称,除了一些标记

时间:2015-01-02 13:45:41

标签: php html regex

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

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

它匹配以下所有内容:

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

我不想匹配input。我可能会在将来排除更多代码,因为我在问题标题中声明了某些代码

What I've tried so far

[编辑]

根据我的示例,我还希望保留仅在匹配结果中返回的标记名称,例如imgabuttondiv,{ {1}}等等。

2 个答案:

答案 0 :(得分:2)

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

试试这个。看看演示。

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

答案 1 :(得分:2)

使用(?!input\b)之类的negative lookahead

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

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