Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как получить данные из строки (http://forum.oszone.net/showthread.php?t=346178)

ateka 17-08-2020 19:45 2931474

Как получить данные из строки
 
Здравствуйте, пытаюсь получить post ID из ссылки.
Ссылки вида:
Код:

https://subd.site.com/some-variably-long-name-2024886/
или например пикабу
https://pikabu.ru/story/derzhatsya_netu_bolshe_sil_7656656/
https://pikabu.ru/story/otvet_na_post_pozhiznennoe_pravo_na_mesto_v_ocheredi_7657274/

Подскажите пожалуйста как получить в переменной только post id то есть только цифры.
Для каждого сайта будет свой скрипт.

megaloman 17-08-2020 21:19 2931479

ateka, Количество цифр постоянно (в ваших примерах 7)?

ateka 17-08-2020 21:21 2931480

Да.

Foreigner 17-08-2020 21:26 2931481

Просто заменить все ненужное:
Код:

@echo off
setlocal

set "str=https://subd.site.com/some-variably-long-name-2024886/"
set "str=%str:-= %"
set "str=%str:/=%"

for %%i in (%str%) do set "id=%%i"

echo %id%


ateka 17-08-2020 21:40 2931483

Цитата:

Цитата Foreigner
Просто заменить все ненужное: »

Спасибо. С пикабу всё замечательно.
С вторым сайтом возникла проблема.
Я не обратил внимание но оказывается в url добавляется параметры.
Код:

https://subd.site.com/some-variably-long-name-2024886/?sorting=best
И с этой ссылкой способ не работает.

Foreigner 17-08-2020 21:50 2931484

Цитата:

Цитата ateka
И с этой ссылкой способ не работает. »

Посоветую решение на powershell. CMD и строки это садомазохизм.
Код:

'https://subd.site.com/some-variably-long-name-2024886/?sorting=best' -replace '.*(\d{7}).*','$1'

greg zakharov 17-08-2020 21:53 2931485

ateka, лучше возьмите sed или pwsh. В первом случае:
Код:

echo https://subd.site.com/some-variably-long-name-2024886/?sorting=best | sed -n "s/.*\([0-9]\{7\}\).*/\1/p"
Во втором:
Код:

((gc X:\path\file.txt) -split '\p{P}').Where{$_ -as [Int32] -and "$_".Length -eq 7}

ateka 17-08-2020 22:00 2931486

Цитата:

Цитата Foreigner
Просто заменить все ненужное: »

Я продолжил по аналогии и вроде работает. Надо потестировать ещё но пост id выдаёт. Спасибо.
Код:

set "str=%str:-= %"
set "str=%str:/=%"
set "str=%str:?=%"
set "str=%str:sorting=%"
set "str=%str:best=%"

Цитата:

Цитата Foreigner
Посоветую решение на powershell. »

Факт что пошик круче смд. Но у меня сейчас системно учиться возможности нет.
На пошике я не пишу а гуглю куски кода если выбора нет. Или прошу помощи.

greg zakharov 17-08-2020 22:05 2931489

К слову, это ведь ссылки. В pwsh к ним применим тип [Uri].
Код:

E:\sandbox
[3] λ [Uri]'https://subd.site.com/some-variably-long-name-2024886/?sorting=best'

AbsolutePath  : /some-variably-long-name-2024886/
AbsoluteUri    : https://subd.site.com/some-variably-long-name-2024886/?sorting=best
LocalPath      : /some-variably-long-name-2024886/
Authority      : subd.site.com
HostNameType  : Dns
IsDefaultPort  : True
IsFile        : False
IsLoopback    : False
PathAndQuery  : /some-variably-long-name-2024886/?sorting=best
Segments      : {/, some-variably-long-name-2024886/}
IsUnc          : False
Host          : subd.site.com
Port          : 443
Query          : ?sorting=best
Fragment      :
Scheme        : https
OriginalString : https://subd.site.com/some-variably-long-name-2024886/?sorting=best
DnsSafeHost    : subd.site.com
IdnHost        : subd.site.com
IsAbsoluteUri  : True
UserEscaped    : False
UserInfo      :

E:\sandbox
[4] λ

А вытаскивать можно из сегментов, либо по абсолютному пути.

Как вариант можно запилить гибрид командного сценария с WSH.

Uragan66 18-08-2020 10:27 2931529

ateka, если на powershell, то можно и таким кодом:
Код:

'https://subd.site.com/some-variably-long-name-2024886/?sorting=best' -match '(\d{7})' | Out-Null
$id = $matches[0]


greg zakharov 18-08-2020 13:49 2931552

Uragan66, указывать искать число как группу не обязательно, достаточно будет \d{7}. Пренебрегать булевым значением, отправляя его в null, не самая лучшая практика (но на вкус и цвет). А вообще в pwsh всё можно уместить в одно выражение:
Код:

$id = 'https://subd.site.com/some-variably-long-name-2024886/?sorting=best' -match '\d{7}' ? $matches[0] : $null

ateka 18-08-2020 13:58 2931554

Всем спасибо большое.
Способ Форинера оказался универсальным и надёжным.
Задача решена.

megaloman 18-08-2020 16:20 2931570

Цитата:

Цитата ateka
Факт что пошик круче смд. Но у меня сейчас системно учиться возможности нет. »

Ежели хочется CMD, то вот гибрид bat и js, сохранить как bat-файл
Код:

@set @E=1; /*

@Echo Off
cls
        Set "U1=https://subd.site.com/some-variably-long-name-2024886/"
        Set "U2=https://pikabu.ru/story/derzhatsya_netu_bolshe_sil_7656656/"
        Set "U3=https://pikabu.ru/story/otvet_na_post_pozhiznennoe_pravo_na_mesto_v_ocheredi_7657274/"
        Set "U4=https://subd.site.com/some-variably-long-name-2024886/?sorting=best"

        FOR /F "usebackq delims=/" %%i IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%U1%"`) DO Set "Out1=%%i"
        FOR /F "usebackq delims=/" %%i IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%U2%"`) DO Set "Out2=%%i"
        FOR /F "usebackq delims=/" %%i IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%U3%"`) DO Set "Out3=%%i"
        FOR /F "usebackq delims=/" %%i IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%U4%"`) DO Set "Out4=%%i"

        Echo "%Out1%"
        Echo "%Out2%"
        Echo "%Out3%"
        Echo "%Out4%"
Pause
Exit /B
*/

var oArg = WScript.Arguments;
WScript.Echo(Uid(oArg(0)));

function Uid(U) {
        var rez = /(\d{7})\//.exec(U);
        try {return rez[0]};
        catch (e) {return " "}
}

Краткости увы нет.
Цитата:

Цитата Foreigner
CMD и строки это садомазохизм. »


greg zakharov 18-08-2020 18:31 2931585

megaloman, странный гибрид, право. try/catch, да ещё и сами строки отчего-то не в контексте js... Если и гибридить, то с "чакрой".
Код:

0</* :
@cscript /nologo /e:{1b7cd997-e5ff-4932-a7a6-2a9e636da385} "%~f0" & exit /b */0;
'use strict';
let arr = [
  'https://subd.site.com/some-variably-long-name-2024886/',
  'https://pikabu.ru/story/derzhatsya_netu_bolshe_sil_7656656/',
  'https://pikabu.ru/story/otvet_na_post_pozhiznennoe_pravo_na_mesto_v_ocheredi_7657274/',
  'https://subd.site.com/some-variably-long-name-2024886/?sorting=best'
];
WScript.echo(arr.map(s => s.match(/\d{7}/)));



Время: 01:56.

Время: 01:56.
© OSzone.net 2001-