Добавить разрешенные и запрещенные правила URL к списку в java - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь записать разрешенные и запрещенные правила файла robots.txt в java, используя следующий код: -

package robotest;
public class RoboTest {
    public static void main(String[] args) {
    String robo="user-agent:hello user-agent:ppx user-agent:bot allow:/world disallow:/ajax disallow:/posts user-agent:abc allow:/myposts/like disallow:/none user-agent:* allow:/world";
    String[] strarr=robo.split(" ");
    String[] allowed={};
    String[] disallowed={};
    boolean new_block=false;
    boolean a_or_d=false;
    for (String line: strarr){
        if(line!=""){
        if(line.contains("user-agent:pp")==false && a_or_d){
            break;
        }
        if (line.contains("user-agent:ppx")||(new_block )){
            new_block=true;
            System.out.println(line);
            if(line.contains("allow") || line.contains("disallow")){
            a_or_d=true;
            }
            if(line.contains("allow:")){
            //append to allowed
            }
            if(line.contains("disallowed")) {
            //append to disallowed
            }
        }
        }
        System.out.println(allowed);;
    }
    }    
}

Код не работает должным образом, как я ожидаю. Правила строки robots.txt отделяются пробелом. Я хочу захватить правила пользовательского агента PPX. Код должен искать блокировку или запрещение после обнаружения user-agent: ppx и добавлять их в список. Но это не работает и сбивает с толку. Я также новичок в регулярных выражениях в java. Какое может быть решение для этого.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Я сделал это немного легко. Остерегайтесь краевых условий, хотя

public class RoboTest {

public void test() {
    String robo = "user-agent:hello user-agent:ppx allow:/aellow disallow:/deasllow disallow:/posts user-agent:bot allow:/world disallow:/ajax disallow:/posts user-agent:abc allow:/myposts/like disallow:/none user-agent:* allow:/world";
    String[] strarr = robo.split(" ");
    List<String> allowed = new ArrayList<>();
    List<String> disAllowed = new ArrayList<>();
    boolean checkAllowed = false;
    for (String line : strarr) {
        if (line.contains("user-agent:ppx")) {
            checkAllowed = true;
            continue;
        } else if (checkAllowed) {
            if (line.contains("disallow:")) {
                disAllowed.add(line.split(":")[1]);
                continue;
            }
            if (line.contains("allow:")) {
                allowed.add(line.split(":")[1]);
                continue;
            }

            checkAllowed = false;
        }
    }
    System.out.println("Allowed" + allowed);
    System.out.println("DisAllowed" + disAllowed);
}

}

1 голос
/ 23 марта 2020

Некоторые минимальные модификации вашего кода:

String robo = "user-agent:hello user-agent:ppx user-agent:bot allow:/world disallow:/ajax disallow:/posts user-agent:abc allow:/myposts/like disallow:/none user-agent:* allow:/world";
String[] strarr = robo.split(" ");
Set<String> allowed = new HashSet<>();
Set<String> disallowed = new HashSet<>();
Pattern allowPattern = Pattern.compile("^allow:\\s*(.*)");
Pattern disallowPattern = Pattern.compile("^disallow:\\s*(.*)");
boolean isUserAgentPpx = false;
boolean a_or_d = false;
for (String line : strarr) {
  line = line.trim();

  // Skip empty lines
  if (line.isEmpty()) continue;

  if (line.startsWith("user-agent:")) {
    // If previous lines were allowed/disallowed rules, then start a new user-agent block
    if (a_or_d) {
      a_or_d = false;
      isUserAgentPpx = false;
    }
    // Skip block of user-agent if we already found 'user-agent: ppx' or 'user-agent: *'
    if (isUserAgentPpx) continue;
    if (line.matches("^user-agent:\\s*(ppx|\\*)$")) {
      isUserAgentPpx = true;
    }
    continue;
  }

  // Process block of allow/disallow
  a_or_d = true;
  if (isUserAgentPpx) {
    Matcher allowMatcher = allowPattern.matcher(line);
    if (allowMatcher.find()) {
     allowed.add(allowMatcher.group(1));
    }
    Matcher disallowMatcher = disallowPattern.matcher(line);
    if (disallowMatcher.find()) {
      disallowed.add(disallowMatcher.group(1));
    }
  }
}

System.out.println("Allowed rules for Ppx:");
for (String s : allowed) {
  System.out.println(s);
}
System.out.println("Disallowed rules for Ppx:");
for (String s : disallowed) {
  System.out.println(s);
}

Я использую Set<String> для хранения правил, чтобы избежать дублирования.

...