Как обрабатывать апостроф в href в SAS

#html #sas

#HTML #sas

Вопрос:

У меня есть программа SAS, которая отправляет электронное письмо с использованием HTML, но одна из папок, на которые я пытаюсь ссылаться в качестве ссылки, содержит апостроф:

 %let body1 = %nrquote(
<ul>
<li><a href='\serverStudiesAlzheimer'sDocuments'>Alzheimer's Documents</a>
</ul>
) ;
  

Эта переменная макроса будет использоваться в следующем макросе:

 %macro sas_email(to=, subject=, body1=, body2=, body3=) ;
options 
  emailsys=smtp 
  emailhost=("smtp.gmail.com" port=465) ;

filename alert email to=(amp;to.) 
                     subject="amp;subject." 
                     content_type="text/html" 
                     debug ;

data _null_ ;
  file alert ;
  put "amp;body1." ;
  %if %length(amp;body2.) > 0 %then %do ;
  put "amp;body2." ;
  %end ;
  %if %length(amp;body3.) > 0 %then %do ;
  put "amp;body3." ;
  %end ;
run ;
%mend sas_email ;
  

Как вы можете себе представить, апостроф в Alzheimer's вызывает проблемы. Использование двойных кавычек вместо одинарных выдает ошибку:

 ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric 
operand is required. The condition was: %length(amp;body1.) > 0
  

Комментарии:

1. используйте encodeURIComponent для создания href

2. о, в вашем случае просто используйте » вместо» (это не 2 кавычки, а одна двойная кавычка)

3. в качестве альтернативы вы можете избежать его с помощью »: … zheimer ‘s Doc…

4. Я не думаю, что URL распознает обратную косую черту как означающую «escape». Они используются для разделения каталогов.

5. @jonathan Heindl ты имеешь в виду Alzheimer"s ?

Ответ №1:

HTML не волнует, используете ли вы двойные или одинарные кавычки. Таким образом, ваш сгенерированный HTML-тег может выглядеть следующим образом:

 <a href="\serverStudiesAlzheimer'sDocuments">
  

Если вы хотите добавить одинарные кавычки в строку, заключенную в одинарные кавычки, закодируйте ее.

 <a href='\serverStudiesAlzheimer'sDocuments'>
  

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

 %let body1 = %bquote(
<ul>
<li><a href="\serverStudiesAlzheimer'sDocuments">Alzheimer's Documents</a>
</ul>
) ;
%let body2=;
%let body3=;
  

Затем при его использовании избегайте попыток расширить макропеременную, используя symget() функцию для извлечения значения макропеременной в фактическую переменную, которую затем можно записать с помощью PUT оператора.

 data _null_;
  file alert ;
  length str $32767;
  do i=1 to 3;
    str=symget(cats('body',i));
    put str ;
  end;
run;
  

Комментарии:

1. Двойные кавычки выдают ошибку ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. , а использование ' указывает на папку с именем Alzheimer's , а не Alzheimer's .

2. Избегайте попыток использовать значение переменной макроса для генерации кода SAS вместо кода HTML. Так что избегайте "amp;body" . Если вам действительно нужно было сгенерировать строковый литерал SAS, попробуйте использовать quote() function . Нравится %sysfunc(quote(%superq(body1),%str(%')))