突出显示HTML标记之外的所有字符串出现的挑战

时间:2015-12-24 01:33:53

标签: html string lazarus freepascal

我正在开发一个Free Pascal-Lazarus(1.4.4)项目,我需要突出显示(使用HTML标记)所有出现的字符串和另一个字符串。但是,我只想替换字符串,如果它是文本,即我必须忽略HTML标记内的出现。

例如: 我想强调单词网格的所有发生(必须不区分大小写):

<p class="Body"><span style="layout-grid-mode: line;" lang="EN-GB">Rome was the most important city in the world. Grid just for test. Grid again...</span></p>

喜欢这个:

<p class="Body"><span style="layout-grid-mode: line;" lang="EN-GB">Rome was the most important city in the world. <span style="background-color: #FA8072 ; color: #ffffff;">Grid</span> just for test. <span style="background-color: #FA8072 ; color: #ffffff;">Grid</span> again...</span></p>

请注意,我必须忽略HTML标记内的单词grid,只更改文本。

祝你好运

2 个答案:

答案 0 :(得分:0)

这是使用正则表达式的质朴解决方案。我假设1°,在文本中,“网格”一词既不是前面也不后面是连字符; 2°,在标签中,单词“grid”始终在连字符之前或之后。如果这些假设成立,那么这段代码可能是解决问题的一种方法。

{$APPTYPE CONSOLE}
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}

uses
  regexpr;

const
  SUBJECT = '<p class="Body"><span style="layout-grid-mode: line;" lang="EN-GB">Rome was the most important city in the world. Grid just for test. Grid again...</span></p>';
  PATTERN = '([^-])([Gg][Rr][Ii][Dd])([^-])';
  REPLACEMENT = '$1<span style="background-color: #FA8072 ; color: #ffffff;">$2</span>$3';

var
  result: string;

begin  
  result := ReplaceRegExpr(
    PATTERN,
    SUBJECT,
    REPLACEMENT,
    TRUE // Use substitution
  );

  WriteLn(result);
  ReadLn;
end.

答案 1 :(得分:0)

fpc在单元中有一个很好的html解析器&#34; fasthtmlparser&#34;。它提供了一个事件OnFoundText,只要解析器找到html文本(外部标记)就会触发该事件。此文本作为参数提供,您可以搜索&#34; Grid&#34;在它中,并取而代之的任何你想要的。然后将此修改后的文本附加到先前找到/修改的文本中。

这是一个有效的控制台项目。为简单起见,我只是致电StringReplace()来找到&#34; Grid&#34;,但当然这也将取代&#34; Grid&#34;如果包含在单词中 - 但您可以使用Roland Chastain的RegExpr解决方案来避免这种情况。

program Project1;

{$mode objfpc}{$H+}

uses
  fasthtmlparser, SysUtils;

type
  TMyHTMLParser = class(THTMLParser)
  private
    FModifiedText: String;
    procedure FoundTextHandler(Text: string);
  public
    property ModifiedText: String read FModifiedText write FModifiedText;
  end;

procedure TMyHTMLParser.FoundTextHandler(Text: String);
begin
  Text := StringReplace(Text,
    'Grid',
    '<span style="background-color: #FA8072 ; color: #ffffff;">Grid</span>',
    [rfReplaceAll, rfIgnoreCase]
  );
  FModifiedText := FModifiedText + Text;
end;

const
  html =
    '<p class="Body">' +
    '<span style="layout-grid-mode: line;" lang="EN-GB">' +
    'Rome was the most important city in the world. '+
    'Grid just for test. Grid again...'+
    '</span>'+
    '</p>:';
var
  parser: TMyHTMLParser;

begin
  parser := TMyHTMLParser.Create(html);
  try
    parser.ModifiedText := '';
    parser.OnFoundText := @parser.FoundTextHandler;
    parser.Exec;
    WriteLn(parser.ModifiedText);
  finally
    parser.Free;
  end;
end.