Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Encontrar ocurrencias entre dos strings (https://www.clubdelphi.com/foros/showthread.php?t=90584)

ellucho 15-07-2016 22:25:52

Encontrar ocurrencias entre dos strings
 
Hola, estoy tratando de encontrar todas las ocurrencias entre dos strings en un codigo html por ejemplo de este codigo:
Código:

<div class="row">
  <div class="col">
    <div class="well">
      <a>Google</a>
    </div>
  </div>
 </div>
<div class="row">
  <div class="col">
    <div class="well">
      <a>Yahoo</a>
    </div>
  </div>
</div>

Me tendia que devolver:
Código:

<a>Google</a>
<a>Yahoo</a>

osea, todo lo que esta entre:
Código:

<div class="well">
y
Código:

</div>
Probe asi pero no hay caso:

Código:

regexpr := TRegEx.Create('<div class="well">(.*)</div>',[roIgnoreCase,roMultiline]);
Le erre con el titulo, deberia decir regexp

mamcx 16-07-2016 02:19:29

Html se debe procesar con un PARSER de html. Las expresiones regulares son insuficientes en este caso.

Ahora bien si la estructura es fija, el problema es que (.*) quiere decir " Captura todo lo que viene a continuacion" y eso significa TODO, y ademas es "greddy" osea, tiene precedencia sobre lo que sigue.

Te recomiendo este sitio que explica todo esto muy bien y completo:

http://www.regexbuddy.com/index.html

Y que sues alguna herramienta para testear regex de forma visual (ese sitio vende una, pero los recursos y tutoriales son genericos).

Para eso especificamente, esta cadena funciona:


Código PHP:

<a>(\w+)</a

Mira que solo captura letras y eso es todo.

ecfisa 17-07-2016 23:27:27

Hola ellucho, bienvenido a los foros de Club Delphi :) y como se acostumbra con los iniciados te invitamos a leer nuestra guía de estilo.


Si solamente buscas las ocurrencias entre dos cadenas exactas, sin pretender la flexibilidad que te ofrece un parser, desde Delphi podes hacer:

Código Delphi [-]
uses StrUtils;

procedure FindBetween(htmlText: string; const Since, Unto: string; Result: TStrings);
var
  p1, p2: Integer;
begin
  if (Since = '') or (Unto = '') then Exit;
  repeat
    p1 := Pos(Since, htmlText);
    p2 := PosEx(Unto, htmlText, p1);
    if (p1 <> 0) and (p2 <> 0) then
    begin
      Result.Add(Trim(Copy(htmlText, p1 + Length(since), (p2 - p1) - Length(since))));
      Delete(htmlText, 1, p2 + Length(Unto));
    end;
  until (p1=0) or (p2 = 0);
end;

Ej. de la prueba:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Lines.Clear;
  FindBetween(Memo1.Text, Edit1.Text, Edit2.Text, Memo2.Lines);
end;

Salida:


Saludos :)

Delphifandev 24-07-2016 02:38:03

Para mí el parser de html es la mejor opción porque el html cambia muchísimo de página a página. Las veces que intenté hacer cosas simples (manipulando cadenas) en html y delphi el resultado fue que funcionaba en algunas páginas y en otras no.


La franja horaria es GMT +2. Ahora son las 17:53:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi