2015-01-18 6 views
0

Почему это trim() возвращает i>abc</i вместо <i>abc</i> при использовании trim($string, "<br />") на строку ниже?Обрезка HTML-тегов из строки в PHP

$string = " <br /> <br /> <i>abc</i> <br /> <br /> </br>"; 

Я хотел, чтобы удалить все <br /> теги от начала и конца строки, считая, что там могут быть некоторые пробелы между ними <br> тегами.

Любые предложения или обходные пути?

+3

Вы читали документацию для [отделка] (http://www.php.net)? Он не обрезает '
'. Он обрезает '<', тогда 'b', затем' r', затем пробелы, затем '/' и s 'и' '' '' '. – h2ooooooo

+0

Обратите внимание на описание функции на странице ['trim' manual] (http://php.net/trim). – Gumbo

+0

Как насчет strip_tags? –

ответ

2

Второй параметр, равный trim, не является строкой как таковой, больше списка символов, которые вы хотите удалить из начала и конца строки. Итак, вы говорите, чтобы полосать все ведущие и задние <, >, \, b и r символов.

Может попробовать что-то вроде этого регулярного выражения раздеть то, что вы хотите от переднего и конце строки ...

//trim from start 
$str=preg_replace('{^(?:<br />|</br>|\s+)+}', '', $str); 
//trim from end 
$str=preg_replace('{(?:<br />|</br>|\s+)+$}', '', $str); 

Просто, чтобы сломать, что первый ...

  • I я использовал {}, чтобы разграничить мое регулярное выражение, так что мне не нужно избегать матчей на косых чертах, которые мне пришлось бы использовать, если бы я использовал «нормальный» разделитель //
  • ^ закрепляет матч с начало строки
  • (?: ) это просто группа вещей, которые мы хотим, чтобы искать
  • внутри группы, мы сопоставляем либо <br />, </br> или любые пробельные последовательности \s+ - вы можете увидеть каждый из этих паттернов, разделенные | в указывают на каждый возможный альтернативный матч
  • группа следует + указать, мы хотим, чтобы найти один или несколько матчей этой группы

Второй похож, но привязывается к концу строки с $

+0

Это странно, но верно. Вместо этого они должны были содержать строку или массив. Иногда я хочу обрезать последовательность символов. –

+0

@Paul Вы можете комбинировать оба оператора '|'., А также ваше регулярное выражение не будет соответствовать '
'. –

+0

Не хочу, чтобы так сложно было следить - добавили в матче за
, хотя и хорошо заметили. –

0

Второй параметр trim() - это строка, содержащая все символов, которые будут обрезаны. Не слова или подстроки, но символов. Это означает, что < и > тоже будут обрезаны, и это то, что происходит.

Что вам нужно сделать, это либо str_replace<br /> перед отделкой, как str_replace('<br />', '', $string), или сделать strip_tags($string, '<i>'), который будет удалять все теги кроме <i>

0

Я хотел, чтобы удалить все <br> теги от начала и конец строки.

preg_replace('~^(?:\s|<br\h*\/>|<\/br>)+|(?:\s|<br\h*\/>|<\/br>)+$~m', '', $string); 

\h* соответствует нулю или более горизонтальных пространств.

DEMO

+0

@ Avanash Raj, если бы я мог вас поддержать, я бы, так как ваш ответ тоже прав. В любом случае спасибо за помощь! :) – RafDias

+0

извините за опечатку – RafDias

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