Применять перенос слов к HTML-содержимому, за исключением атрибутов HTML - PullRequest
1 голос
/ 13 января 2011

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

По сути, я применяю перенос слов к содержимому, которое содержит классические HTML-теги:, ...

  $text = wordwrap($text, $cutLength, " ", $wordCut);
  $text = nl2br(bbcode_parser($text));
  return $text;

Как видите, моя проблема довольно проста: все, что я хочу, это применить wordwrap () к моему контенту, исключая то, что может быть в атрибутах html: href, src ...

Может ли кто-нибудь мне помочь? Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Используйте любой анализатор DOM, способный извлекать текстовые узлы из документа.Выполните итерацию по текстовым узлам, примените к ним wordwrap и запишите их обратно в соответствующие текстовые узлы.

Этот подход идентичен подходу, приведенному в

, вместо того чтобы проверять текстовое содержимое на наличие ссылок, вы применяете к ним wordwrap.

Чем большеобщая формулировка вашей проблемы: «Как (выборочно) извлечь текстовое содержимое документа HTML, чтобы применить к нему функцию» *

1 голос
/ 14 января 2011

Конечно, вы не должны использовать regex для разбора html, но это должно выделять
контент, если вы захотите.У меня ограниченные знания php, так что это просто иллюстрирует процедуру.

$tags = 
'  <
   (?:
       /?\w+\s*/?
     | \w+\s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*/?
     | !(?:DOCTYPE.*?|--.*?--)
   )>
';

$scripts =
'   <
   (?:
       (?:script|style) \s*
     | (?:script|style) \s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*
   )>
   .*?
   </(?:script|style)\s*>
';

$regex = / ($scripts | $tags) | ((?:(?!$tags).)+) /xsg;

Строка замены Group1 преобразуется в возвращаемое значение вашей функции переноса слов (передается содержимое, строка Group2), поэтому что-то вроде:замена = \ 1.textwrap (\ 2)
Внутри textwrap вы решаете, что делать с контентом.

Протестировано в Perl (кстати, оно очень медленное и размытое для ясности):

use strict;
use warnings;

my $tags = 
'  <
   (?:
       /?\w+\s*/?
     | \w+\s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*/?
     | !(?:DOCTYPE.*?|--.*?--)
   )>
';

my $scripts =
'   <
   (?:
       (?:script|style) \s*
     | (?:script|style) \s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*
   )>
   .*?
   </(?:script|style)\s*>
';

my $html = join '', <DATA>;

while ( $html =~ / ($scripts | $tags) | ((?:(?!$tags).)+) /xsg ) {
    if (defined $2 && $2 !~ /^\s+$/) {
        print $2,"\n";
    }
}
...