html — извлекает теги nonHTML с регулярным выражением в переполнении стека

Я пытаюсь извлечь не 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;
}

1

Решение

Я ищу лучшее регулярное выражение, чтобы пропустить весь контент между <!-- в -->

Чтобы пропустить что-то, используйте (* SKIP) (* F). Поставить такие как <!--(?s:.*?)-->(*SKIP)(*F)| до:

/<!--(?s:.*?)-->(*SKIP)(*F)|(<![^>]*[^\/]>)/i

Не изменил ваше фактическое регулярное выражение. Regex101 хорош для тестирования также см Regex FAQ 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]