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
[编辑]
根据我的示例,我还希望保留仅在匹配结果中返回的标签名称,例如 img
、a
、button
、div
, 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]+)([^>]*>)?
如果要单独保存标签。
使用 negative lookahead 如 (?!input\b)
:
<(?!input\b)([\w]+)([^>]*>)?
要排除多个标签,请使用 (?!(?:tag1|tag2|tag3|...)\b)
我正在尝试使用 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
[编辑]
根据我的示例,我还希望保留仅在匹配结果中返回的标签名称,例如 img
、a
、button
、div
, 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]+)([^>]*>)?
如果要单独保存标签。
使用 negative lookahead 如 (?!input\b)
:
<(?!input\b)([\w]+)([^>]*>)?
要排除多个标签,请使用 (?!(?:tag1|tag2|tag3|...)\b)