Я пытаюсь извлечь не 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> -->
=> Не работает! (Tag2 & Tags3 извлечено)
Я ищу лучшее регулярное выражение, чтобы пропустить весь контент между <!--
в -->
Спасибо за любые советы.
Для лучшей перспективы это оригинальная функция:
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;
}
Я ищу лучшее регулярное выражение, чтобы пропустить весь контент между
<!--
в-->
Чтобы пропустить что-то, используйте (* SKIP) (* F). Поставить такие как <!--(?s:.*?)-->(*SKIP)(*F)|
до:
/<!--(?s:.*?)-->(*SKIP)(*F)|(<![^>]*[^\/]>)/i
Не изменил ваше фактическое регулярное выражение. Regex101 хорош для тестирования также см Regex FAQ 🙂
Других решений пока нет …