Как вернуть частичную строку в ColdFusion - PullRequest
5 голосов
/ 28 января 2011

Допустим, у меня есть строка The big brown fox jumped<br> over the fence. Как я могу указать, что я хочу оставить только те символы, которые находятся перед тегом <br>, удаляя остальные?

Ответы [ 6 ]

5 голосов
/ 28 января 2011

Я использую что-то похожее, не знаю, является ли это более эффективным.

<cfset string = "The big brown fox jumped<br> over the fence.">

<cfset firstPiece = listGetAt(string, 1, "<br>")>
<cfoutput>#firstPiece#</cfoutput>

Мне это нравится, потому что я определяю результат до вывода, а не на выходе.Но orangepips хорош, потому что вы можете адаптировать свой вывод в зависимости от контекстаспособа CF рассматривает каждый символ как разделитель.

Но <cfset firstPiece = listGetAt(string, 1, "<") производит «Большой бурый лис прыгнул».

Из документации CF

Разделители

Строка или переменная, которая содержит один.Символ (ы), которые разделяют элементы списка.Значением по умолчанию является запятая.

Если этот параметр содержит более одного символа, ColdFusion обрабатывает каждое вхождение каждого символа в качестве разделителя.

2 голосов
/ 29 января 2011

Если вы не возражаете, перейдя к фрагменту старого Java, лежащего в основе CF ... Строка AColdFusion на самом деле является строкой Java. Разделение Java использует регулярное выражение, которое в простейшем случае может быть просто строкой, на которую вы хотите разделить. Так что в отличие от listToArray (который, кстати, был расширен в cf9, чтобы разрешить многосимвольные разбиения), он по определению является многосимвольным. И поскольку это регулярное выражение, если вы хотите, чтобы оно не учитывало регистр символов, это тоже может быть легко выполнено.

Итак, учитывая вашу строку:

<cfset variables.myString = "The big brown fox jumped<br> over the fence." />
<cfset variables.myStringArray = variables.myString.split("(<[bB][Rr]>)",2) />
<cfset variables.myString = variables.myStringArray[1] />

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

1 голос
/ 28 января 2011

Все любят регулярные выражения, кроме меня.Итак, вот подход, использующий вместо этого строковые функции:

<cfset str = "The big brown fox jumped<br> over the fence.">
<!--- roughly the equivalent of str.split("<br>") --->
<cfset pieces = listToArray(str, "<br>")> 
<cfoutput>#pieces[1]#</cfoutput>

Обновление

Мех, у вас нет под рукой сервера CFГлупо listToArray().Вот тот, который должен работать.

<cfset str = "The big brown fox jumped<br> over the fence.">
<cfset pos = find(str, "<br>")>
<!--- probably off by one here, don't have CF server handy --->
<cfset piece = left(str, pos)> 

Обновление # 2

Доступ к серверу CF сейчас.Это работает.Адреса всех комментариев:

<cfset str = "The big brown fox jumped<br> over the fence.">
<cfset pos = findNoCase("<br>", str)>
<cfset piece = (pos ? left(str, pos - 1) : str)>
<cfoutput>#piece#</cfoutput>
0 голосов
/ 08 января 2013

Использование регулярных выражений:

<cfset str = "The big brown fox jumped<br> over the fence." />
<cfset firstPart =     REReplaceNoCase( str,  "<br>.*$", "") />
<cfoutput>#firstPart#</cfoutput>
0 голосов
/ 29 января 2011

Почему бы не использовать функцию listFirst как в:

<cfset str = "The big brown fox jumped<br> over the fence." />
<cfset firstPart = listfirst(str, "<br>") />
<cfoutput>#firstPart#</cfoutput>
0 голосов
/ 28 января 2011
...