Сжать пробелы между атрибутами в теге HTML - PullRequest
2 голосов
/ 07 декабря 2010

Мы только что выпустили некоторый код, чтобы сделать наше программное обеспечение немного более удобным для пользователя, и это привело к обратным результатам.По сути, мы пытаемся заменить символы новой строки тегами <br />.Проблема в том, что иногда наши пользователи вводят код, подобный следующему:

<a
 href='http://nowhere.com'>Nowhere</a>

Когда мы запускаем наш код, это переводится в

<a <br />href='http://nowhere.com' />Nowhere</a>

, что, очевидно, не отображается правильно1008 *

Существует ли регулярное выражение или функция PHP для удаления или, возможно, сжатия пробелов между атрибутами тега HTML?

Уточнение: Это не полностьюHTML.Это больше похоже на Markdown или какой-то другой язык (в конечном итоге мы перейдем к Markdown, но мне нужно быстрое решение).Так что я не могу просто разобрать это как обычный HTML.Символы новой строки должны быть правильно преобразованы в теги <br />.

Ответы [ 4 ]

3 голосов
/ 07 декабря 2010

Хммм, почему вы используете инструменты для форматирования html, когда они не предназначены для этой цели, приобретите DOM Library.

http://simplehtmldom.sourceforge.net/

2 голосов
/ 07 декабря 2010

Вам нужна библиотека, которая бы правильно анализировала весь HTML, который вы добавляете, вы никогда не знали, что могут изобрести пользователи.

Посмотрите на Очиститель HTML

1 голос
/ 07 декабря 2010

После некоторого поиска и большого количества проб и ошибок я нашел следующее решение / хак:

/*
 * Compress all whitespace within HTML tags (including PRE at the moment)
 */
$regexp = "/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i";

preg_match_all($regexp, $text, $matches);

foreach($matches[0] as $match) {
  $new_html = preg_replace('/\s+/', ' ', $match);
  $text = str_replace($match, $new_html, $text);
}

После выполнения этого кода все HTML-теги в $text будут правильно отформатированы и верныбез символов новой строки.

Я знаю, что это не лучшее решение, но оно работает, и довольно скоро мы перейдем на настоящий язык разметки (такой как Markdown).

0 голосов
/ 07 декабря 2010

В идеале вы должны использовать синтаксический анализатор XML через API DOM или SAX. Однако, если ваш контент не является правильным XML, а представляет собой обычный текст с несколькими тегами, синтаксический анализатор может дать сбой (я думаю, это зависит от используемого инструмента).

Примерное решение вашей конкретной проблемы может быть следующим: создать конечный автомат с двумя состояниями: внутри тега и вне тега. Вы читаете ввод за символом. Прочитав «<», переключитесь в «внутреннее» состояние. Прочитав «>», переключитесь в состояние «снаружи». Прочитав '\ n' и перейдя в состояние "outside", выведите "
" (в противном случае ничего не выведите).

Это всего лишь эскиз, и, возможно, его нужно доработать.

...