我正在开发一个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,只更改文本。
祝你好运
答案 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.