aVogt
Returning Creator

Exalead5.1: Auwertung des Suchstrings (searchString)

Jump to solution

Hallo,

bei Exalead5.1 wird der Suchstring

     Hand* (corporate/tree:"Top/Source/SAB_Intranet")

vom Formular zur Suchseite codiert übertragen. Den Suchstring erweitere ich automatisch vor dem Absenden z.B. durch Erweiterung in der zu suchenden Source. Ich erhalte z.B:

     & #72& #97& #110& #100& #42& #32& #40& #99& #111& #114  ....  

(ohne Leerzeichen zwischen & und #) über session.getAttribute("searchString").

Damit nur der Suchbegriff auf der Ergebnisseite angezeigt wird, muss ich den Suchstring somit bearbeiten und alles "überflüssige" entfernen z.B. die Source.

Bei Exalead4.3 war das kein Problem, da der Suchstring in dieser Version "lesbar" übertragen wurde.

Nun habe ich eine Möglichkeit gefunden die Zeichen in "richtige" Buchstaben und Zahlen zu wandeln (mit unescapeHtml4(string) aus org.apache.commons.lang3.StringEscapeUtils).

Allerdings ist es dafür notwendig immer ein Semikolon am Ende eines Zeichens einzufügen. Also & #72 => & #72;

Gibt es eine einfachere Methode? Bietet Exalead sogar so etwas an?

Grüße

Andreas

0 Kudos
1 Solution

Accepted Solutions
marro
Crownpeak employee

Hallo,

wenn der Suchstring, wie in diesem Fall, modifiziert werden muss, dann kann er mit folgender Methode unescaped werden:

<%!

    public String unescape(String text) {

        if (text != null) {

            java.util.StringTokenizer st = new java.util.StringTokenizer(text, "&#");

            java.util.ArrayList<Character> charList = new java.util.ArrayList<Character>();

            while (st.hasMoreTokens()) {

                String token = st.nextToken();

                if (token.length() > 0) {

                    Character charToken = (char) Integer.parseInt(token);

                    charList.add(charToken);

                }

            }

            char[] chars = new char[charList.size()];

            for (int i = 0; i < charList.size(); i++) {

                chars[i] = charList.get(i);

            }

            return new String(chars);

        } else return null;

    }

%>

Nach der Bearbeitung des Suchstrings sollte dieser aber wieder escaped werden. Dazu eignet sich folgende Methode:

<%!

    private String escape(final String text) {

        if (text != null) {

            StringBuffer sb = new StringBuffer();

            char[] chars = text.toCharArray();

            for (final char aChar : chars) {

                sb.append("&#").append((int) aChar);

            }

   

            return sb.toString();

        } else return "";

    }

%>

Ein Beispiel für die Nutzung der beiden Methoden, könnten so aussehen:

<%

String queryString = unescape((String) session.getAttribute("searchString"));

...

... Modifikation des queryStrings

...

queryString = escape(queryString);

%>

Viele Grüße,

Donato

View solution in original post

0 Kudos
2 Replies
marro
Crownpeak employee

Hallo,

wenn der Suchstring, wie in diesem Fall, modifiziert werden muss, dann kann er mit folgender Methode unescaped werden:

<%!

    public String unescape(String text) {

        if (text != null) {

            java.util.StringTokenizer st = new java.util.StringTokenizer(text, "&#");

            java.util.ArrayList<Character> charList = new java.util.ArrayList<Character>();

            while (st.hasMoreTokens()) {

                String token = st.nextToken();

                if (token.length() > 0) {

                    Character charToken = (char) Integer.parseInt(token);

                    charList.add(charToken);

                }

            }

            char[] chars = new char[charList.size()];

            for (int i = 0; i < charList.size(); i++) {

                chars[i] = charList.get(i);

            }

            return new String(chars);

        } else return null;

    }

%>

Nach der Bearbeitung des Suchstrings sollte dieser aber wieder escaped werden. Dazu eignet sich folgende Methode:

<%!

    private String escape(final String text) {

        if (text != null) {

            StringBuffer sb = new StringBuffer();

            char[] chars = text.toCharArray();

            for (final char aChar : chars) {

                sb.append("&#").append((int) aChar);

            }

   

            return sb.toString();

        } else return "";

    }

%>

Ein Beispiel für die Nutzung der beiden Methoden, könnten so aussehen:

<%

String queryString = unescape((String) session.getAttribute("searchString"));

...

... Modifikation des queryStrings

...

queryString = escape(queryString);

%>

Viele Grüße,

Donato

0 Kudos
aVogt
Returning Creator

VIELEN Dank!

Grüße

Andreas

0 Kudos