SPLIT результаты с разделителем - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь разбить строку (разделенную тегом разрыва HTML), не удаляя тег разрыва. Я думаю, что довольно грязно добавлять разрыв как строку после разделения, так есть ли какая-либо функция / возможность сохранить разделитель во время «разделения»?

Пример:

<HTML><BODY><p>some text<br/>some more text</p></BODY></HTML>

Ожидаемый результат:

<HTML><BODY><p>some text<br/>
some more text</p></BODY></HTML>

Ответы [ 2 ]

3 голосов
/ 04 октября 2019

Насколько я знаю, SPLIT удаляет разделитель из результатов, и кажется, что вы не можете его изменить.

Но вы можете создать свой собственный разделитель, сначала заменив тег <br/>с <br/> плюс произвольная строка, которая вряд ли когда-либо появится в вашем источнике HTML, а затем разделит HTML, используя вместо этого эту произвольную строку в качестве разделителя.

types:
  begin of t_result,
    segment(2000) type c,
  end of t_result.

DATA:
  source type string,
  separator type string,
  brtag type string,
  repl type string,
  result_tab type standard table of t_result,
  result_row TYPE t_result.

brtag = '<br/>'.
separator = '|***SEP***|'.
concatenate brtag separator into repl.
source = '<HTML><BODY><p>some text<br/>some more text</p></BODY></HTML>'.

replace all occurrences of brtag in source with repl.
split source at separator into table result_tab.

LOOP AT result_tab INTO result_row.
  WRITE:
  result_row-segment.
ENDLOOP.

Вывод этого примера отчета:

<HTML><BODY><p>some text<br/>
some more text</p></BODY></HTML>

Предостережение этого решения заключается в том, что ваш пользовательский разделитель, если он не выбран с осторожностью, может появиться в вашем исходном HTML-коде сам по себе. Поэтому я бы выбрал произвольную строку со специальным символом или двумя, которые будут закодированы в HTML (например, умляуты) и, следовательно, не появятся в вашем источнике.

1 голос
/ 10 октября 2019

Просто используйте команду замены. замените <br/> на <br/>CR_LF
CR_LF относится к символу перевода строки при возврате каретки. В более сложных случаях вы можете использовать выражения регулярных выражений в abap.

class ZTEST_SO definition   public    create public .
public section.
methods t1.
ENDCLASS.
CLASS ZTEST_SO IMPLEMENTATION.
  METHOD T1.
     data: my_break type string,
            my_string type string
                    value '<HTML><BODY><p>some text<br/>some more text</p></BODY></HTML>'.

     my_break = '<br/>' && CL_ABAP_CHAR_UTILITIES=>CR_LF.
     replace all occurrences of '<br/>' in my_string with my_break in character mode.
     "check my_string in the debugger :)

     "<HTML><BODY><p>some text<br/>
     "some more text</p></BODY></HTML>
  ENDMETHOD.
ENDCLASS.
...