Управление данными формы на стороне сервера с помощью JSoup в ColdFusion

В продолжение моего предыдущего вопроса (Как заменить все теги привязки на другую привязку с помощью регулярных выражений в ColdFusion), я хотел бы использовать JSoup для управления содержимым Argument, поступающего из Form , прежде чем вставлять обработанный контент в базу данных.

Вот пример того, что отправляется на сервер из формы:

<form>
   <div id="Description" contenteditable="true">
   <p>
      Terminator Genisys is an upcoming 2015 American 
      science fiction action film directed by Alan Taylor. 

      <img id="Img0" src="http://www.moviepics.com/terminator1.jpg" />
      <img id="Img1" src="http://www.moviepics.com/terminator2.jpg" />
      <img id="Img2" src="http://www.moviepics.com/terminator2.jpg" />

      You can find out more by <a href="http://www.imdb.com">clicking here</a>
   </p>
   </div>
</form>

Вот как мой CFC справится с этим в настоящее время (основная идея):

<cfquery>
INSERT INTO MyTable (Value1, Description)
VALUES
(
   <cfif structkeyexists(ARGUMENTS.Value1)>
      <cfqueryparam value="#ARGUMENTS.Value1#" cf_sql_type="nvarchar" />
   <cfelse>
      NULL
   </cfif>

   ,
   <!--- 
    Before the below happens, I need to replace the src 
    attributes of the img tags of Arguments.Description 
   --->
   <cfif structkeyexists(ARGUMENTS.Description)>
       <cfqueryparam value="#ARGUMENTS.Description#" cf_sql_type="nvarchar" />
   <cfelse>
       NULL
   </cfif>
)
</cfquery>

Я знаю, что <div> не является элементом формы, но не беспокойтесь, он все еще отправляется в CF11, как будто это элемент формы, использующий хитрость JQuery serialize().

Когда CF11 обрабатывает эту форму, он получает данные в ARGUMENTS.Description. Что я хочу сделать, так это проанализировать содержимое этого аргумента, найти теги <img> и извлечь атрибут src.

Затем я проведу дополнительную обработку, но в конечном итоге мне нужно будет заменить значения src в каждом из тегов img другим значением, созданным CF11 на стороне сервера. Только тогда я могу вставить значение формы в базу данных.

Может ли JSoup помочь в такой задаче? Это похоже на простую задачу поиска и замены, но я очень не понимаю, как это сделать.


person volume one    schedule 16.02.2015    source источник
comment
jSoup идеально подходит для чего-то подобного. Вы можете использовать RegEx, но, скорее всего, столкнетесь с крайними случаями, когда процесс завершится ошибкой.   -  person Scott Stroz    schedule 16.02.2015


Ответы (1)


Во-первых, у вас ошибка в разметке, атрибуты src тегов изображений не имеют закрывающих кавычек. Убедитесь, что вы исправили это, прежде чем пытаться использовать это

<cfsavecontent variable="samform">
    <form>
    <div id="Description" contenteditable="true">
    <p>Terminator Genisys is an upcoming 2015 American science fiction action film directed by Alan Taylor. 

    <img id="Img0" src="http://www.moviepics.com/terminator1.jpg" />
    <img id="Img1" src="http://www.moviepics.com/terminator2.jpg" />
    <img id="Img2" src="http://www.moviepics.com/terminator2.jpg" />

    You can find out more by <a href="http://www.imdb.com">clicking here</a></p>
    </div>
    </form>
</cfsavecontent>

<cfscript>
jsoup = CreateObject("java", "org.jsoup.Jsoup");
alterform = jsoup.parse(samform);

imgs = alterform.select("##Description img");


for (img in imgs) {
    img.attr("src", "betterthan#listlast(img.attr("src"),"/")#");
}

imgs[2].attr("src", "TheyShouldHaveStoppedAtT2.gif");

writeOutput('<textarea rows="10" cols="100">#samform#</textarea><br>');
writeOutput('<textarea rows="10" cols="100">#alterform#</textarea>');
</cfscript>

Если вы знакомы с селекторами css или селекторами jquery, выбор jSoup почти второстепенен.

Что это делает, так это то, что он зацикливается на каждом img в #Description (# должно быть удвоено, потому что CF). Затем он меняет URL-адрес на что-то на основе текущего URL-адреса, а затем, просто для демонстрации, я переопределяю src второго img чем-то другим и вывожу до/после в текстовых областях.

person Regular Jo    schedule 16.02.2015
comment
На самом деле мне нужно изменить содержимое самого аргумента, чтобы он теперь содержал разные атрибуты src. Я хочу, чтобы они вставили это в базу данных. Это возможно? Я отредактировал свой вопрос, чтобы предоставить больше кода/лучше понять, что я имею в виду - person volume one; 16.02.2015
comment
@volumeone да, вы можете сказать img[1].attr("src",arguments.value1) и т. д. Цикл не нужен, я просто показывал вам разные техники. - person Regular Jo; 16.02.2015
comment
Могу ли я анализировать только #ARGUMENTS.Description#, а не всю форму? - person volume one; 18.02.2015
comment
@volumeone Вы можете анализировать любую переменную, содержащую действительную разметку. Я использовал всю форму только потому, что вы сказали, что получаете ее через JS Trickery, поэтому я просто взял образец прямо из вашего поста. В код не нужно вносить никаких изменений, если ваш синтаксис html правильный (поскольку в нем была отсутствующая цитата в том, что вы разместили здесь, но это можно было бы выделить здесь. - person Regular Jo; 18.02.2015
comment
Я не могу отблагодарить вас за то, что вы показали мне это. Это прекрасно работает! Это так же быстро. Это действительно помогло мне тонны. - person volume one; 18.02.2015
comment
@volumeone Рад, что это помогло! - person Regular Jo; 18.02.2015