在 PHP 中使用正则表达式提取非 HTML 标签
Extraxt nonHTML tags with regular expression in PHP
我正在尝试从字符串中提取非HTML 标签(例如:<!This TAG>
)。
我使用下面的正则表达式来提取标签:
$Tags = preg_split('/(<![^>]*[^\/]>)/i', $Content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
但问题是所有 HTML 评论标签(如 <!-- This One -->
)也将被提取。
我可以使用像下面示例这样的技巧来删除评论标签,但仍然会提取它们之间的任何非HTML 标签!
foreach($Tags as $key => $value) {
if(mb_substr($value, 0, 4) == '<!--')
continue;
$CheckTag = mb_substr($value, 0, 2);
if($CheckTag == '<!') {
//...
}
}
例如:
<!--<p>some text here.</p>-->
=> 工作。
<!-- <!Tag1><!Tag2><!Tag3> -->
=> 无效! (提取标签 2 和标签 3)
我正在寻找更好的正则表达式来跳过 <!--
到 -->
之间的全部内容,谢谢任何提示。
为了更好的视角,这是原始函数:
public function extractFakeTags($Content) {
$Tags = preg_split('/(<![^>]*[^\/]>)/i', $Content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$FakeTags = array();
$Content = $Tags;
foreach($Tags as $key => $current) {
if(mb_substr($current, 0, 4) == '<!--')
continue;
$TagBegin = mb_substr($current, 0, 2);
if($TagBegin == '<!') {
$TagLength = mb_strlen($current);
$TagEnd = mb_substr($current, ($TagLength-1), 1);
if($TagEnd=='>') {
$TagName = mb_substr($current, 2, ($TagLength-3));
if (array_key_exists($TagName, $FakeTags)) {
array_push($FakeTags[$TagName], $key);
}
else {
$FakeTags[$TagName] = array($key);
}
$Content[$key] = NULL;
}
}
}
return $FakeTags;
}
I'm looking for better regular expression to skip entire content between <!--
to -->
要跳过某些内容,请使用 (*SKIP)(*F)。把比如<!--(?s:.*?)-->(*SKIP)(*F)|
放在前面:
/<!--(?s:.*?)-->(*SKIP)(*F)|(<![^>]*[^\/]>)/i
没有修改您的实际正则表达式。 Regex101 is good for testing also see Regex FAQ:)
我正在尝试从字符串中提取非HTML 标签(例如:<!This TAG>
)。
我使用下面的正则表达式来提取标签:
$Tags = preg_split('/(<![^>]*[^\/]>)/i', $Content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
但问题是所有 HTML 评论标签(如 <!-- This One -->
)也将被提取。
我可以使用像下面示例这样的技巧来删除评论标签,但仍然会提取它们之间的任何非HTML 标签!
foreach($Tags as $key => $value) {
if(mb_substr($value, 0, 4) == '<!--')
continue;
$CheckTag = mb_substr($value, 0, 2);
if($CheckTag == '<!') {
//...
}
}
例如:
<!--<p>some text here.</p>-->
=> 工作。
<!-- <!Tag1><!Tag2><!Tag3> -->
=> 无效! (提取标签 2 和标签 3)
我正在寻找更好的正则表达式来跳过 <!--
到 -->
之间的全部内容,谢谢任何提示。
为了更好的视角,这是原始函数:
public function extractFakeTags($Content) {
$Tags = preg_split('/(<![^>]*[^\/]>)/i', $Content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$FakeTags = array();
$Content = $Tags;
foreach($Tags as $key => $current) {
if(mb_substr($current, 0, 4) == '<!--')
continue;
$TagBegin = mb_substr($current, 0, 2);
if($TagBegin == '<!') {
$TagLength = mb_strlen($current);
$TagEnd = mb_substr($current, ($TagLength-1), 1);
if($TagEnd=='>') {
$TagName = mb_substr($current, 2, ($TagLength-3));
if (array_key_exists($TagName, $FakeTags)) {
array_push($FakeTags[$TagName], $key);
}
else {
$FakeTags[$TagName] = array($key);
}
$Content[$key] = NULL;
}
}
}
return $FakeTags;
}
I'm looking for better regular expression to skip entire content between
<!--
to-->
要跳过某些内容,请使用 (*SKIP)(*F)。把比如<!--(?s:.*?)-->(*SKIP)(*F)|
放在前面:
/<!--(?s:.*?)-->(*SKIP)(*F)|(<![^>]*[^\/]>)/i
没有修改您的实际正则表达式。 Regex101 is good for testing also see Regex FAQ:)