За последние 24 часа нас посетили 208709 программистов и 4674 робота. Сейчас ищут 1420 программистов ...

Разбор URL

Тема в разделе "Регулярные выражения", создана пользователем zhenia3003, 15 апр 2024.

  1. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Здравствуйте.
    Есть ссылки:
    1. resolution-1920x1440
    2. resolution-1920x1440-orientation-landscape
    3. resolution-1920x1440-orientation-landscape-sort-view
    Есть необходимость сделать валидацию ссылок, для этого написал регулярное выражение, но оно ищет только третью ссылку:
    PHP:
    1. /(resolution-([0-9x])+)(-)(orientation-(landscape|portrait)+)(-)(sort-(view|top|donloads|random)+)/i
    Как сделать, чтобы поиск был на 3 ссылки?
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    97
    Адрес:
    Бавария, Германия
    Добрый день!
    Так
    PHP:
    1. <?
    2. $urlStr = <<<EOF
    3. resolution-1920x1440
    4. resolution-1920x1440-orientation-landscape
    5. resolution-1920x1440-orientation-portrait
    6. resolution-1920x1440-orientation-landscape-sort-view
    7.  
    8. resolution1920x1440
    9. resolution-1920x1440-orientation-landscape-sort
    10. resolution-1920x1440-orientation-landscape-tort-cookie
    11. EOF;
    12.  
    13. $urlArr = explode(PHP_EOL, $urlStr);
    14.  
    15. $pattern = "/^(resolution-\d+x\d+)((-orientation-(landscape|portrait))?)((-sort-(view|top|donloads|random))?)$/i";
    16.  
    17. foreach($urlArr as $url)
    18.     echo $url," -> ", preg_match($pattern, $url), "<br>";
    19.  
    20. /*
    21. resolution-1920x1440 -> 1
    22. resolution-1920x1440-orientation-landscape -> 1
    23. resolution-1920x1440-orientation-portrait -> 1
    24. resolution-1920x1440-orientation-landscape-sort-view -> 1
    25. -> 0
    26. resolution1920x1440 -> 0
    27. resolution-1920x1440-orientation-landscape-sort -> 0
    28. resolution-1920x1440-orientation-landscape-tort-cookie -> 0
    29. */
    Удачи!
     
  3. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Здравствуйте.
    Этот способ работает, если последовательно будут добавляться вхождения "resolution-1920x1440" -> "orientation-landscape" -> "sort-view", а если последовательность будет обратная, например "sort-view" -> "orientation-landscape"?
     
  4. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    97
    Адрес:
    Бавария, Германия
    Добрый день!
    PHP:
    1. <?
    2. $urlStr = <<<EOF
    3. resolution-1920x1440
    4. resolution-1920x1440-orientation-landscape
    5. resolution-1920x1440-orientation-portrait
    6. resolution-1920x1440-orientation-portrait-sort-top
    7. resolution-1920x1440-orientation-landscape-sort-view
    8.  
    9. resolution-1920x1440-sort-view-orientation-landscape
    10. resolution-1920x1440-sort-view-orientation-portrait
    11.  
    12. resolution1920x1440
    13. resolution-1920x1440-orientation-landscape-sort
    14. resolution-1920x1440-orientation-landscape-tort-cookie
    15. EOF;
    16.  
    17. $urlArr = explode(PHP_EOL, $urlStr);
    18.  
    19. $pattern  = "/^(resolution-\d+x\d+)";
    20. $pattern .= "(";
    21. $pattern .= "((-orientation-(landscape|portrait))?)((-sort-(view|top|donloads|random))?)";
    22. $pattern .= "|";
    23. $pattern .= "((-sort-(view|top|donloads|random))?)((-orientation-(landscape|portrait))?)";
    24. $pattern .= ")";
    25. $pattern .= "$/i";
    26.  
    27. echo "\$pattern = \"$pattern\"<hr>";
    28.  
    29. foreach($urlArr as $url)
    30.     echo $url," -> ", preg_match($pattern,$url),"<br>";
    31.  
    32. /*
    33.  
    34. $pattern = "/^(resolution-\d+x\d+)(((-orientation-(landscape|portrait))?)((-sort-(view|top|donloads|random))?)|((-sort-(view|top|donloads|random))?)((-orientation-(landscape|portrait))?))$/i"
    35.  
    36. resolution-1920x1440 -> 1
    37. resolution-1920x1440-orientation-landscape -> 1
    38. resolution-1920x1440-orientation-portrait -> 1
    39. resolution-1920x1440-orientation-portrait-sort-top -> 1
    40. resolution-1920x1440-orientation-landscape-sort-view -> 1
    41. -> 0
    42. resolution-1920x1440-sort-view-orientation-landscape -> 1
    43. resolution-1920x1440-sort-view-orientation-portrait -> 1
    44. -> 0
    45. resolution1920x1440 -> 0
    46. resolution-1920x1440-orientation-landscape-sort -> 0
    47. resolution-1920x1440-orientation-landscape-tort-cookie -> 0
    48. resolution1920x1440 -> 0
    49. resolution-1920x1440-orientation-landscape-sort -> 0
    50. resolution-1920x1440-orientation-landscape-tort-cookie -> 0
    51. */
    Удачи!
     
  5. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Пробовал добавлять "или" (|) в регулярку. Если первое вхождение не resolution, а "sort-view" то вхождение не найдено (если ссылка начинается как "sort-view-orientation-portrait" или просто "orientation-portrait").
    Код (Text):
    1. resolution-1920x1440 -> 1
    2. resolution-1920x1440-orientation-landscape -> 1
    3. sort-view-orientation-portrait -> 0
    4. orientation-portrait -> 0
    5. sort-view -> 0
    6. sort-view- -> 0
     
    #5 zhenia3003, 18 апр 2024
    Последнее редактирование: 18 апр 2024
  6. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    97
    Адрес:
    Бавария, Германия
    Добрый день!
    Если ещё чего-то забыли, просто добавьте примеры возможных URLs
    Это с дополненениями
    PHP:
    1. <?
    2. $urlStr = <<<EOF
    3. resolution-1920x1440
    4. resolution-1920x1440-orientation-landscape
    5. resolution-1920x1440-orientation-portrait
    6. resolution-1920x1440-orientation-portrait-sort-top
    7. resolution-1920x1440-orientation-landscape-sort-view
    8. resolution-1920x1440-sort-view-orientation-landscape
    9. resolution-1920x1440-sort-view-orientation-portrait
    10. sort-view-orientation-portrait
    11. orientation-portrait
    12. sort-view
    13. sort-top
    14. resolution1920x1440
    15. resolution-1920x1440-orientation-landscape-sort
    16. resolution-1920x1440-orientation-landscape-tort-cookie
    17. EOF;
    18.  
    19. $urlArr = explode(PHP_EOL, $urlStr);
    20.  
    21. $pattern  = "/^((resolution-\d+x\d+)?)(-?)";
    22. $pattern .= "(";
    23. $pattern .= "((orientation-(landscape|portrait))?)((-sort-(view|top|donloads|random))?)";
    24. $pattern .= "|";
    25. $pattern .= "((sort-(view|top|donloads|random))?)((-orientation-(landscape|portrait))?)";
    26. $pattern .= ")";
    27. $pattern .= "$/i";
    28.  
    29. echo "\$pattern = \"$pattern\"<hr>";
    30.  
    31. foreach($urlArr as $url)
    32.     echo $url," -> ", preg_match($pattern,$url),"<br>";
    33.  
    34. /*
    35. $pattern = "/^((resolution-\d+x\d+)?)(-?)(((orientation-(landscape|portrait))?)((-sort-(view|top|donloads|random))?)|((sort-(view|top|donloads|random))?)((-orientation-(landscape|portrait))?))$/i"
    36. resolution-1920x1440 -> 1
    37. resolution-1920x1440-orientation-landscape -> 1
    38. resolution-1920x1440-orientation-portrait -> 1
    39. resolution-1920x1440-orientation-portrait-sort-top -> 1
    40. resolution-1920x1440-orientation-landscape-sort-view -> 1
    41. resolution-1920x1440-sort-view-orientation-landscape -> 1
    42. resolution-1920x1440-sort-view-orientation-portrait -> 1
    43. sort-view-orientation-portrait -> 1
    44. orientation-portrait -> 1
    45. sort-view -> 1
    46. sort-top -> 1
    47. resolution1920x1440 -> 0
    48. resolution-1920x1440-orientation-landscape-sort -> 0
    49. resolution-1920x1440-orientation-landscape-tort-cookie -> 0
    50. */
    Удачи!

    p.s. Вам не нужно столько URLs
    resolution и orientation можно определить в коде с помощью CSS media queries.
     
    #6 Vladimir Kheifets, 18 апр 2024
    Последнее редактирование: 18 апр 2024
  7. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Спасибо, последний вариант работает как нужно было.
    Все вероятные значения resolution и orientation получаю из БД, вывожу через select