Delphi извлекает строку между двумя тегами - PullRequest
6 голосов
/ 31 августа 2010

Как мне извлечь текст из двух HTML-тегов, используя delphi?Вот пример строки.

blah blah blah<tag>text I want to keep</tag>blah blah blah

, и я хочу извлечь эту ее часть.

<tag>text I want to keep</tag>

(в основном, удаление всего мусора бла-бла-бла, который идет до и после <tag> & </tag> строк, которые я также хочу сохранить.

Как я уже сказал, я уверен, что это очень легко для тех, кто знает, но я просто не могу обернуть это вокруг головы в настоящее время. Спасибозаранее за ваши ответы.

Ответы [ 4 ]

7 голосов
/ 31 августа 2010

Если у вас Delphi XE, вы можете использовать новый RegularExpressions блок:

ResultString := TRegEx.Match(SubjectString, '(?si)<tag>.*?</tag>').Value;

Если у вас более старая версия Delphi, вы можете использовать сторонний компонент регулярных выражений, такой как TPerlRegEx :

Regex := TPerlRegEx.Create(nil);
Regex.RegEx := '(?si)<tag>.*?</tag>';
Regex.Subject := SubjectString;
if Regex.Match then ResultString := Regex.MatchedExpression;
7 голосов
/ 31 августа 2010

Это полностью зависит от того, как выглядит ваш ввод.

Обновление Сначала я написал несколько решений для особых случаев, но после ОП объяснил немного подробнее о деталях, мне пришлосьобобщите их немного.Вот наиболее общий код:

function ExtractTextInsideGivenTagEx(const Tag, Text: string): string;
var
  StartPos1, StartPos2, EndPos: integer;
  i: Integer;
begin
  result := '';
  StartPos1 := Pos('<' + Tag, Text);
  EndPos := Pos('</' + Tag + '>', Text);
  StartPos2 := 0;
  for i := StartPos1 + length(Tag) + 1 to EndPos do
    if Text[i] = '>' then
    begin
      StartPos2 := i + 1;
      break;
    end;


  if (StartPos2 > 0) and (EndPos > StartPos2) then
    result := Copy(Text, StartPos2, EndPos - StartPos2);
end;


function ExtractTagAndTextInsideGivenTagEx(const Tag, Text: string): string;
var
  StartPos, EndPos: integer;
begin
  result := '';
  StartPos := Pos('<' + Tag, Text);
  EndPos := Pos('</' + Tag + '>', Text);
  if (StartPos > 0) and (EndPos > StartPos) then
    result := Copy(Text, StartPos, EndPos - StartPos + length(Tag) + 3);
end;

Пример использования

ExtractTextInsideGivenTagEx('tag',
    'blah <i>blah</i> <b>blah<tag a="2" b="4">text I want to keep</tag>blah blah </b>blah')

возвращает

text I want to keep

, тогда как

ExtractTagAndTextInsideGivenTagEx('tag',
    'blah <i>blah</i> <b>blah<tag a="2" b="4">text I want to keep</tag>blah blah </b>blah')

возвращает

<tag a="2" b="4">text I want to keep</tag>
3 голосов
/ 02 января 2013

Я считаю, что эта версия более универсальна, поскольку она не ограничена одним появлением теговОн ищет следующий конечный тег после стартового тега.

Function ExtractBetweenTags(Const Line, TagI, TagF: string): string;
var
  i, f : integer;
begin
  i := Pos(TagI, Line);
  f := Pos(TagF, Copy(Line, i+length(TagI), MAXINT));
  if (i > 0) and (f > 0) then
    Result:= Copy(Line, i+length(TagI), f-1);
end;
3 голосов
/ 31 августа 2010

Вы можете создать функцию, используя функции pos copy .

посмотрите этот пример.

Function ExtractBetweenTags(Const Value,TagI,TagF:string):string;
var
i,f : integer;
begin
 i:=Pos(TagI,Value);
 f:=Pos(TagF,Value);
 if (i>0) and (f>i) then
 Result:=Copy(Value,i+length(TagI),f-i-length(TagF)+1);
end;


Function ExtractWithTags(Const Value,TagI,TagF:string):string;
var
i,f : integer;
begin
 i:=Pos(TagI,Value);
 f:=Pos(TagF,Value);
 if (i>0) and (f>i) then
 Result:=Copy(Value,i,f-i+length(TagF));
end;

и позвоните вот так

StrValue:='blah blah blah<tag> text I want to keep</tag>blah blah blah';
NewValue:=ExtractBetweenTags(StrValue,'<tag>','</tag>');//returns 'text I want to keep'
NewValue:=ExtractWithTags(StrValue,'<tag>','</tag>');//returns '<tag>text I want to keep</tag>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...