Regex HEXCode

SonicBe@m

Erfahrenes Mitglied
Hallo zusammen,

ich bin langsam am Ende mit meinem Latein.

Folgendes Szenario:

ich habe ein Textfeld wo der Benutzer sachen wie z.b.

  1. test%25$Mxf%25bla
  2. test%xf%25bla
  3. test%xx%25bla
eingeben darf.

Ich möchte mit regex nun allerdings die normalen % zeichen entfernen aber nur dann wenn es sich nicht um hex handelt also wäre z.b.

  1. test%25$Mxf%25bla > test $Mxf bla
  2. test%xf%25bla > test%xf bla
  3. test%xx%25bla > test%xx bla

ich hab es nun schon mit folgendem probiert
Code:
(?:%[^a-f0-9]{2,2})/i
(%[a-f0-9]{2,2})/i


das liefert mir allerdings nur im Beispiel 3 die richtigen Informationen
Beispiel 2 wird nicht erkannt weil ja das F vorhanden ist.

Anmerkung:
Es betrifft NUR zeichen welche ein % am anfang enthalten

Gibt es eine möglichkeit wie ich in regex sagen kann das es nur gefunden werden soll wenn es in Kombination auftritt und falsch ist?
z.B.

Soll nicht gefunden werden
  1. %0F = hex
  2. %A0 = hex
  3. %AF = hex
Soll gefunden werden
  1. %AX = kein hex
  2. %0X = kein hex
  3. %GH = kein hex

mich würde nur und ausschließlich alles interessieren was nicht hex ist.

vielen Dank.
 
Zuletzt bearbeitet von einem Moderator:
  1. test%25$Mxf%25bla > test $Mxf bla
  2. test%xf%25bla > test%xf bla
  3. test%xx%25bla > test%xx bla

Die Ersetzungen verstehe ich nicht. Du sagst du willst alle "%" entfernen, sofern Sie kein Hex einleiten? Wieso entfernst du dann "%25"? Und geht es auschließlich um zweistellige Hex-Werte? Und wieso entfernst du "%25", wenn du doch eigentlich nur das Prozentzeichen entfernen willst?
 
Hab ich wohl nicht richtig geschrieben.

Ansich geht es darum das es einem url decode nachempfunden wird sprich alle % werden in %25 umkonvertiert.

Da es aber auch Hex gibt muss ich diese hierbei berücksichtigen.
am ende dürfte kein % zeichen was alleinstehen ist im text vorkommen.
 
So ich hab den ganzen Spass nun in Java umgesetzt.
Eine reimplementierung in Javascript sollte damit also kinderleicht sein.
Code:
import java.util.regex.Pattern;


public class Encoder {

    private final static Pattern ENCODER_ALL_NOT =
        Pattern.compile("(%)([^a-fA-F0-9][a-fA-F0-9]|[a-fA-F0-9][^a-fA-F0-9]|[^a-fA-F0-9][^a-fA-F0-9])|(%)($)|(^)(%)$");
    private final static Pattern ENCODER_DOUBLE_PERCENT_KEY = Pattern.compile("[%][%]([a-z0-9])|[%][%]([^a-z0-9])");
    private final static Pattern ENCODER_DOUBLE_PERCENT = Pattern.compile("[%][%]");
    private final static String ENCODER_ALL_NOT_REPLACEMENT = "%25%25$1";
    private final static String ENCODER_DOUBLE_PERCENT_KEY_REPLACEMENT = "%25$2";
    private final static String ENCODER_DOUBLE_PERCENT_REPLACEMENT = "%25%25%";


    public static String encode(String pToEncode) {
        String replaced = pToEncode;
        replaced = ENCODER_DOUBLE_PERCENT_KEY.matcher(replaced).replaceAll(ENCODER_ALL_NOT_REPLACEMENT);
        replaced = ENCODER_ALL_NOT.matcher(replaced).replaceAll(ENCODER_DOUBLE_PERCENT_KEY_REPLACEMENT);
        replaced = ENCODER_DOUBLE_PERCENT.matcher(replaced).replaceAll(ENCODER_DOUBLE_PERCENT_REPLACEMENT);
        return replaced;
    }


    public static void main(String[] args) {
        String[] todo =
            {"%", "a%", "test%", "test%test", "test%FFtest", "test%test%FF", "%FFtest", "test%%%%%test", "%%%%%"};

        for (String elem : todo) {
            System.out.println(elem);
            System.out.println(Encoder.encode(elem));
            System.out.println();
        }
    }
}
 
Eine reimplementierung in Javascript sollte damit also kinderleicht sein.

Für dich oder jemand anderen? Habs mal schnell gemacht.

Javascript:
var
	ENCODER_ALL_NOT = new RegExp("(%)([^a-fA-F0-9][a-fA-F0-9]|[a-fA-F0-9][^a-fA-F0-9]|[^a-fA-F0-9][^a-fA-F0-9])|(%)($)|(^)(%)$", "g"),
	ENCODER_DOUBLE_PERCENT_KEY = new RegExp("[%][%]([a-z0-9])|[%][%]([^a-z0-9])", "g"),
	ENCODER_DOUBLE_PERCENT = new RegExp("[%][%]", "g"),
	ENCODER_ALL_NOT_REPLACEMENT = "%25%25$1",
	ENCODER_DOUBLE_PERCENT_KEY_REPLACEMENT = "%25$2",
	ENCODER_DOUBLE_PERCENT_REPLACEMENT = "%25%25%";

var Encoder = {};
Encoder.encode = function(pToEncode) {
	var replaced = pToEncode;
	
	replaced = replaced.replace(ENCODER_DOUBLE_PERCENT_KEY, ENCODER_ALL_NOT_REPLACEMENT);
	replaced = replaced.replace(ENCODER_ALL_NOT, ENCODER_DOUBLE_PERCENT_KEY_REPLACEMENT);
	replaced = replaced.replace(ENCODER_DOUBLE_PERCENT, ENCODER_DOUBLE_PERCENT_REPLACEMENT);
	
	return replaced;
};

var todo = ["%", "a%", "test%", "test%test", "test%FFtest", "test%test%FF", "%FFtest", "test%%%%%test", "%%%%%"];

for(var i=0; i<todo.length; i++) {
	document.write(todo[i]);
	document.write("<br>");
	document.write(Encoder.encode(todo[i]));
	document.write("<br>");
	document.write("<br>");
}
 
Zurück