Регулярное выражение для замены перевода строки пробелом, только если разрыв не содержится в содержимом атрибута HTML - PullRequest
1 голос
/ 22 октября 2010

Я пытаюсь написать регулярное выражение, которое заменяет переводы строк между определенными областями текстового файла, но только для простого текстового содержимого (т.е. исключает текст из содержимого атрибутов HTML, например, href), но без особой удачи после первого часть.

Пример ввода:

AUTHOR: Me
DATE: Now
CONTENT:
This is an example. This is another example. <a href="http://www.stackoverflow/example-
link-that-breaks">This is an example.</a> This is an example. This is yet another
example.
END CONTENT
COMMENTS: 0

Пример вывода:

AUTHOR: Me
DATE: Now
CONTENT:
This is an example. This is another example. <a href="http://www.stackoverflow/example-link-that-breaks">This is an example.</a> This is an example. This is yet another example.
END CONTENT
COMMENTS: 0

Так что в идеале пробел заменяет разрывы строк, если они встречаются в виде обычного текста, но удаляет их без добавления пробела, если они находятся внутри параметров HTML (в основном href, и я в порядке, если мне придется ограничиться этим).

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Это удалит новые строки в значениях атрибутов, при условии, что значения заключены в двойные кавычки:

$s = preg_replace(
       '/[\r\n]+(?=[^<>"]*+"(?:[^<>"]*+"[^"<>]*+")*+[^<>"]*+>)/',
       '', $s);

Предварительный просмотр утверждает, что между текущей позицией (где была найдена новая строка) и следующей > существует нечетное число двойных кавычек. Это не учитывает значения в одинарных кавычках или угловые скобки внутри значений; оба могут быть приспособлены, если это необходимо, но это уже достаточно уродливо. ;)

После этого вы можете заменить любые оставшиеся символы новой строки пробелами:

$s = preg_replace('/[\r\n]+/', ' ', $s);

Смотрите это в действии на ideone.com.

1 голос
/ 22 октября 2010

В идеале вы должны использовать настоящий HTML-парсер (или XML, если это был XHTML) и заменить содержимое атрибута этим.

Однако, следующее может помочь, если движок поддерживает положительный просмотр за произвольной длиной:

(?<=\<[^<>]+=\s*("[^"]*|'[^']*))[\r\n]+

Использование: Заменить все вхождения этого регулярного выражения на пустую строку.

...