2016-04-19 2 views
3

У меня есть HTML в строке. Я хочу разделить его часть <head>. Я использую:Какой самый быстрый способ удалить строку из определенного тега

$html = preg_replace("/<head[^>]*?>.*?<\/head>/s", "", $html); 

Но с точки зрения производительности это может быть немного тяжелым. Есть ли лучшая альтернатива?

Я знаю, что могу использовать strip_tags() и перечислить все принятые теги во втором аргументе, но его слишком много, чтобы его перечислить.

+0

Вы можете использовать 'strpos()' для определения позиции открывающего и закрывающего тега '', а затем получить подстроку, но я не уверен, что это лучше способ сделать это снова. – Paul

+6

Вы можете написать лучшее регулярное выражение :) Как ['] *?> [^ <] * (?: <(?!\/head>) [^ <]*)*<\/head>'] (https://regex101.com/r/iY3cC5/2). Сравните с [вашим] (https://regex101.com/r/iY3cC5/1). –

+0

@ WiktorStribiżew Это тот! Можете ли вы написать ответ и объяснить, как он уменьшает шаги и т. Д. Очень впечатляет. Могу ли я добавить больше тегов в одно и то же регулярное выражение? Как '

ответ

0

Ваше текущее регулярное выражение занимает 6720 шагов при тестировании на части этой страницы SO.

Это регулярное выражение <head[^>]*?>(?:[^<]*<??)*</head> занимает всего 376 шагов, и оно должно возвращать то же самое. Он должен быть почти в 20 раз быстрее, чем ваше регулярное выражение.

Он работает жадно сопрягая все, что это не < здесь: [^<]*

Тогда, потому что <?? ленив, он будет пытаться немедленно соответствовать </head>. Если нет совпадения, то <?? вводит ноты.

Смежные вопросы