2012-02-12 3 views
3

Мне нужно получить строку без тегов в начале и конце строки. Я знаю strip_tags, но, как вы знаете, он удаляет все теги. Например:Удалить теги из начала и конца строки с помощью PHP

<span class="note"> 
    <span></span>This is my text <strong>Hello world</strong> 
</span> 

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

Кто-нибудь знает быстрое решение этого вопроса, например, выражение reg-выражения или что-то (вещь, в которой я плохо себя чувствую). Не могу найти такую ​​вещь в сети, поэтому я спрашиваю ее здесь.

Благодарим за вклад.

ответ

3

DOMDocument будет удобно для этого ...

$dom = new DOMDocument; 

$dom->loadHTML($html); 

$html = ''; 

foreach($dom->getElementsByTagName('body')->item(0)->firstChild->childNodes as $node) { 
    $html .= trim($dom->saveHTML($node)); 
} 

echo $html; 

CodePad.

Если вы unswayable об использовании регулярных выражений, вы можете использовать ...

$html = preg_replace('/^\s*<[^>]+>\s*|\s*<\/[^>]+>\s*\z/', '', $html); 

CodePad.

Обратите внимание, что HTML-тег с атрибутом, содержащим >, не приведет к повторному выражению. Вот почему я предпочел бы решение DOMDocument.

Оба этих решения будут разделять ведущие и завершающие пробельные текстовые узлы. Если это нежелательно, оставьте trim() из первого примера и \s* со второго примера.

+0

Спасибо за быстрый ответ. Я не могу использовать DOMDocument, потому что документ уже загружен, и я не хочу его дважды загружать (память), но, возможно, я могу использовать его для разбора фрагмента. Кроме того, выражение reg отлично работает, если вы не добавили пустой тег (например, ). Не проблема, что он не работает, когда атрибут содержит «>», это способ плохого кодирования. Но можете ли вы изменить его так, чтобы пустой пробел также был удален? Спасибо огромное! – Codebeat

+0

Попробуйте изменить '/^\ s * <[^>] +> \ s * | \ s * <\/[^>] +> \ s * \ z /' с '/^\ s * <[^>] +> | <\/[^>] +> \ s * \ z/'и я думаю, что вы получите желаемый результат? :) – tftd

+0

Нет, получите тот же результат? – Codebeat

0

Я бы пошел с простой функцией, а не вызывал классы DOM - они работают медленнее.
Это то, что я обычно делаю: http://codepad.viper-7.com/RVKmAG

+0

Спасибо, но это не то, что я хочу, кажется, что он делает то же самое, что и strip_tags, потому что var_dump полностью без какого-либо тега. – Codebeat

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