Что нового

[Данные, строки] Обработка ссылки с помощью StrinRegExp.

Gzzk

Новичок
Сообщения
104
Репутация
1
Всем привет.
Опять нужно порезать строку по шаблону.
Есть два типа ссылок:
1:
Код:
тип поста-id автора_id поста
Примеры:
http://vk.com/wall-42599381_1022
http://vk.com/wall-48490619_837
http://vk.com/wall-51043187_11
Нужно получить тип,id автора,id поста.
У думаю,это будет выглядеть так:
Тип поста:от '/' до '-'
Id автора:от '-' до '_'
id поста:от '_' до конца.
2.
Код:
тип постаid автора_id поста
Примеры:
http://vk.com/photo58950867_301277199
http://vk.com/wall83132790_11463
http://vk.com/video157561473_164618957
Получить нужно тоже самое.
Возможно,это будет выглядеть как-то так:
Тип поста:от '/' до любой цифры.
Id автора:от любой цифры до '_'
id поста:от '_' до конца.
Ни то,ни другое я не смог реализовать как шаблон.
Помогите пожалуйста!
Заранее благодарен.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Gzzk
Если анализ построчно, то в 1 варианте должен даже просто StringSplit подойти:
Код:
#include <Array.au3>

$sData = 'http://vk.com/wall-42599381_1022'
$res_array = StringSplit($sData, '/-_')
_ArrayDisplay($res_array)

В массиве элементы должны оставаться на том же месте.

А вот код, который по идее должен оба варианта обрабатывать одинаково, правда, он довольно длинный)

Код:
#include <Array.au3>

$sData = 'http://vk.com/video157561473_164618957'
$res_array = _StringSplitRegExp($sData, '\-|/|_|to|ll|eo')
$res_array = _ArrayClearEmpty1($res_array)
_ArrayDisplay($res_array)

$sData = 'http://vk.com/wall-42599381_1022'
$res_array = _StringSplitRegExp($sData, '\-|/|_|to|ll|eo')
$res_array = _ArrayClearEmpty1($res_array)
_ArrayDisplay($res_array)

Func _StringSplitRegExp($sString, $sPattern, $sIncludeMatch = false, $iCount = 0)
	Local $sReservedPattern = Chr(0)
	Local $sReplacePattern = $sReservedPattern
	If $sIncludeMatch Then $sReplacePattern = "$0" & $sReplacePattern
	$sTemp = StringRegExpReplace($sString, $sPattern, $sReplacePattern, $iCount)
	If StringRight($sTemp, 1) = $sReservedPattern Then $sTemp = StringTrimRight($sTemp, 1)
	$aResult = StringSplit($sTemp, $sReservedPattern, 1)
	Return $aResult
EndFunc  

Func _ArrayClearEmpty1($a_Array, $i_SubItem = 0, $i_Start = 0)
    If Not IsArray($a_Array) Or UBound($a_Array, 0) > 2 Then Return SetError(1, 0, 0)
 
    Local $i_Index = -1
    Local $i_UBound_Row = UBound($a_Array, 1) - 1
    Local $i_UBound_Column = UBound($a_Array, 2) - 1
 
    If $i_UBound_Column = -1 Then $i_UBound_Column = 0
    If $i_SubItem > $i_UBound_Column Then $i_SubItem = 0
    If $i_Start < 0 Or $i_Start > $i_UBound_Row Then $i_Start = 0
 
    Switch $i_UBound_Column + 1
        Case 1
            Dim $a_TempArray[$i_UBound_Row + 1]
            If $i_Start Then
                For $i = 0 To $i_Start - 1
                    $a_TempArray[$i] = $a_Array[$i]
                Next
                $i_Index = $i_Start - 1
            EndIf
            For $i = $i_Start To $i_UBound_Row
                If String($a_Array[$i]) Then
                    $i_Index += 1
                    $a_TempArray[$i_Index] = $a_Array[$i]
                EndIf
            Next
            If $i_Index > -1 Then
                ReDim $a_TempArray[$i_Index + 1]
            Else
                Return SetError(2, 0, 0)
            EndIf
        Case 2
            Dim $a_TempArray[$i_UBound_Row + 1][$i_UBound_Column + 1]
            If $i_Start Then
                For $i = 0 To $i_Start - 1
                    For $j = 0 To $i_UBound_Column
                        $a_TempArray[$i][$j] = $a_Array[$i][$j]
                    Next
                Next
                $i_Index = $i_Start - 1
            EndIf
            For $i = $i_Start To $i_UBound_Row
                If String($a_Array[$i][$i_SubItem]) Then
                    $i_Index += 1
                    For $j = 0 To $i_UBound_Column
                        $a_TempArray[$i_Index][$j] = $a_Array[$i][$j]
                    Next
                EndIf
            Next
            If $i_Index > -1 Then
                ReDim $a_TempArray[$i_Index + 1][$i_UBound_Column + 1]
            Else
                Return SetError(2, 0, 0)
            EndIf
    EndSwitch
    Return SetError(0, $i_UBound_Row - $i_Index, $a_TempArray)
EndFunc

За _ArrayClearEmpty спасибо madmasles
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
#include <Array.au3>

$sText= _
'тип поста-id автора_id поста' & @CRLF & _
'Примеры:' & @CRLF & _
'http://vk.com/wall-42599381_1022' & @CRLF & _
'http://vk.com/wall-48490619_837' & @CRLF & _
'http://vk.com/wall-51043187_11'
$sText=StringRegExp($sText, '(?mi)^http://(.+?)-(\d+?)_(.+?)\r$', 3)
_ArrayDisplay($sText)

$sText= _
'тип постаid автора_id поста' & @CRLF & _
'Примеры:' & @CRLF & _
'http://vk.com/photo58950867_301277199' & @CRLF & _
'http://vk.com/wall83132790_11463' & @CRLF & _
'http://vk.com/video157561473_164618957'
$sText=StringRegExp($sText, '(?mi)^http://(.+?)(\d+?)_(.+?)\r$', 3)
_ArrayDisplay($sText)



Добавлено:
Сообщение автоматически объединено:

WSWR
_StringRegExpSplit - универсальнее
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вариант:
Код:
#Include<Array.au3>
$sText = "http://vk.com/wall-42599381_1022"  & @CRLF & _ 
"http://vk.com/wall-48490619_837"  & @CRLF & _ 
"http://vk.com/wall-51043187_11"  & @CRLF & _ 
"http://vk.com/photo58950867_301277199"  & @CRLF & _ 
"http://vk.com/wall83132790_11463"  & @CRLF & _ 
"http://vk.com/video157561473_164618957"
$sPatern = "http://(.*?)-?(\d*?)_(\d*)"
;или :
;$sPatern = "\w/(\w*?)-?(\d*?)_(\d*)"
$aResult = StringRegExp( $sText, $sPatern, 3 )
_ArrayDisplay($aResult, ' Test Result ')
 
Верх