我尝试使用PHP中的正则表达式匹配除input
标记之外的任何打开的HTML标记。这是我的模式。
/<([a-z]+)([^>]*>)?/i
它匹配以下所有内容:
<input type="text">
<img src=">
<a href="">
<button type="button"></button>
<div id="some"></div>
<p></p>
我不想匹配input
。我可能会在将来排除更多代码,因为我在问题标题中声明了某些代码。
根据我的示例,我还希望保留仅在匹配结果中返回的标记名称,例如img
,a
,button
,div
,{ {1}}等等。
答案 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]+)([^>]*>)?
如果您想单独保存标签。
答案 1 :(得分:2)
使用(?!input\b)
之类的negative lookahead:
<(?!input\b)([\w]+)([^>]*>)?
要排除多个代码,请使用(?!(?:tag1|tag2|tag3|...)\b)