PDA

Показать полную графическую версию : [решено] Как получить данные из строки


ateka
17-08-2020, 19:45
Здравствуйте, пытаюсь получить 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
ateka, Количество цифр постоянно (в ваших примерах 7)?

ateka
17-08-2020, 21:21
Да.

Foreigner
17-08-2020, 21:26
Просто заменить все ненужное:

@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
Просто заменить все ненужное: »
Спасибо. С пикабу всё замечательно.
С вторым сайтом возникла проблема.
Я не обратил внимание но оказывается в url добавляется параметры.
https://subd.site.com/some-variably-long-name-2024886/?sorting=best
И с этой ссылкой способ не работает.

Foreigner
17-08-2020, 21:50
И с этой ссылкой способ не работает. »
Посоветую решение на powershell. CMD и строки это садомазохизм.

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

greg zakharov
17-08-2020, 21:53
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
Просто заменить все ненужное: »
Я продолжил по аналогии и вроде работает. Надо потестировать ещё но пост id выдаёт. Спасибо.
set "str=%str:-= %"
set "str=%str:/=%"
set "str=%str:?=%"
set "str=%str:sorting=%"
set "str=%str:best=%"

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

greg zakharov
17-08-2020, 22:05
К слову, это ведь ссылки. В 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
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
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
Всем спасибо большое.
Способ Форинера оказался универсальным и надёжным.
Задача решена.

megaloman
18-08-2020, 16:20
Факт что пошик круче смд. Но у меня сейчас системно учиться возможности нет. »Ежели хочется 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 " "}
}Краткости увы нет.CMD и строки это садомазохизм. »

greg zakharov
18-08-2020, 18:31
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}/)));




© OSzone.net 2001-2012