я смог прочитать данные из текстового файла, используя Imagemagick с http://www.imagemagick.org .
и я получаю
0,0: (255,255,255, 0) #FFFFFF00 srgba(255,255,255,0) 1,0: (255,255,255, 0) #FFFFFF00 srgba(255,255,255,0) 2,0: (255,255,255, 0) #FFFFFF00 srgba(255,255,255,0) 40,23: (162,167, 32, 24) #A2A72018 srgba(162,167,32,0.0941176) 41,23: (255,255,255, 0) #FFFFFF00 srgba(255,255,255,0) 42,23: (162,166, 48, 40) #A2A63028 srgba(162,166,48,0.156863) 43,23: (162,166, 47, 40) #A2A62F28 srgba(162,166,47,0.156863)
Я не очень хорошо разбираюсь в регулярных выражениях, какое выражение я бы использовал для получения координат в начале и rgba () в конце.
хорошо, я как-то понял, что регулярное выражение здесь равноценно
/rgba\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]\.[0-9]{1-9}/gi
но последняя часть не соответствует десятичной части rgba ().
ok Я знаю, что это было некоторое время, и я не уверен, что я должен начать новый поток
но я понял, как удалить, чтобы удалить две средние части, все круглые скобки и srgba, также строки с нулевой альфа, но каким-то образом он оставляет открытое пространство в текстовом файле. если есть какие-либо улучшения, которые кто-либо может увидеть.
$fh = fopen("pcmanD.txt", "r"); $fg = fopen("pcmanJ.txt", "wt"); $new_array = ""; $parts = ""; while (!feof($fh)) { $line = fgets($fh); $lines[] = $line; $newword = ""; $match1 ="/:\s?\s?\(\s?\s?\d+,\s?\s?\d+,\s?\s?\d+,\s?\s?\d+\)\s?\s?#[a-zA-Z0-9]{6,8}\s?\s?srgba/"; $match2 ="/^\s\s?/"; $match3 = "/\s\(/"; $match4 = "/\)/"; $match5 = "/[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},0[^\.]/"; $parts1 = preg_replace($match1,"", $line ); $parts2 = preg_replace($match2,"", $parts1 ); $parts3 = preg_replace($match3,",", $parts2 ); $parts4 = preg_replace($match4,"", $parts3 ); $parts5 = preg_replace($match5,"",$parts4); echo "<pre>"; print_r($parts5); echo "</pre>"; fwrite($fg, $parts5); } fclose($fg); fclose($fh);
но возникает новая проблема с этим кодом, где я получаю двойную или тройную по плавающим точкам после матча.
$thisisit[] = ""; $thisisit2[] = ""; $countThis = 0; $fh = fopen("sometext.txt", "r"); $new_array = ""; $parts = ""; while (!feof($fh)) { $line = fgets($fh); $line2 = $line; $newword = ""; $match1 ="/^\s*?[\d]+,[\d]+/"; $parts1 = preg_match($match1, $line, $regs); foreach($regs as $key => $lame) { $thisisit[] = $lame; } $match2 ="/(?:(\d{1,3},\d{1,3},))(\d{1,3},\d{1,3},\d{1,3},[01][\.]?[\d]*)/"; $parts2 = preg_match($match2, $line2, $regs2); foreach($regs2 as $key2 => $lame2) { $thisisit2[] =$lame2; } $countLame = count($thisisit); } echo "</script>"; $newCounter = 0; for($i = 0; $i < (500); $i++) { echo $thisisit[$i] . "<br />"; echo $thisisit2[$newCounter] . "<br />" ; $newCounter = $newCounter +4; } fclose($fh);
вот какой текст в текстовом файле, над которым я работаю
42,23,162,166,48,0.156863 43,23,162,166,47,0.156863 44,23,167,170,67,0.219608 45,23,162,166,47,0.156863 46,23,167,170,67,0.219608 47,23,162,166,37,0.117647 48,23,162,167,32,0.0941176 86,23,163,167,40,0.12549 87,23,160,164,47,0.164706 88,23,188,190,122,0.352941 86,24,233,234,197,0.486275 87,24,251,250,250,1 88,24,251,250,250,1 89,24,251,250,250,1
> '0,0: (255,255,255, 0)'.match(/^([^:]+) *: *\(([^)]+)\)/) [ '0,0: (255,255,255, 0)', '0,0', '255,255,255, 0', index: 0, input: '0,0: (255,255,255, 0)' ]
/^(\d+,\d+):.*\(([^)]*)\)$/
Это должно вывести координаты в группу захвата 1 и значения RGBA в группу 2. Обратите внимание, однако, что, вероятно, более эффективно использовать манипуляции с строками для этого, если это имеет к вам значение. Вы можете разбить строку на :
для получения координат, затем разделить на srgba(
и отрубить последний символ для значений цвета.
Если у вас несколько строк $input
$input = ' 0,0: (255,255,255, 0) #FFFFFF00 srgba(255,255,255,0) 43,23: (162,166, 47, 40) #A2A62F28 srgba(162,166,47,0.156863) '; preg_match_all('~^\s*(.+?):.+srgba\((.+?)\)\s*$~m', $input, $match); print_r($match);
Array ( [0] => Array ( [0] => 0,0: (255,255,255, 0) #FFFFFF00 srgba(255,255,255,0) [1] => 43,23: (162,166, 47, 40) #A2A62F28 srgba(162,166,47,0.156863) ) [1] => Array ( [0] => 0,0 [1] => 43,23 ) [2] => Array ( [0] => 255,255,255,0 [1] => 162,166,47,0.156863 ) )
Если у вас есть однострочный $input
с более глубоким регулярным выражением:
$input = '43,23: (162,166, 47, 40) #A2A62F28 srgba(162,166,47,0.156863)'; preg_match('~^\s*(\d+),\s*(\d+):.+srgba\(\s*(\d+),\s*(\d+),\s*(\d+),\s*(.+?)\)\s*$~m', $input, $match); print_r($match);
Array ( [0] => 43,23: (162,166, 47, 40) #A2A62F28 srgba(162,166,47,0.156863) [1] => 43 [2] => 23 [3] => 162 [4] => 166 [5] => 47 [6] => 0.156863 )