Показать полную графическую версию : [решено] Как получить данные из строки
Здравствуйте, пытаюсь получить 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)?
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%
Просто заменить все ненужное: »
Спасибо. С пикабу всё замечательно.
С вторым сайтом возникла проблема.
Я не обратил внимание но оказывается в 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}
Просто заменить все ненужное: »
Я продолжил по аналогии и вроде работает. Надо потестировать ещё но пост 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
Всем спасибо большое.
Способ Форинера оказался универсальным и надёжным.
Задача решена.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.