Intereting Posts
Ошибка PHP и MYSQLI, вызов функции-функции члена () для не-объекта jquery для заполнения нескольких выпадающих списков из базы данных PHP Получить текущее имя файла после перезаписи URL Взаимодействие Laravel Eloquent One to Many Создайте папку, если она еще не существует. QuickBooks обнаружил ошибку при анализе предоставленного текстового потока XML Отображать элемент RSS-ленты в интрасети через php Почему мое тестовое приложение в бесконечном цикле перенаправления? Сессия конфликтует с несколькими проектами Laravel на одном сервере Отправить письмо через PHPMailer на один адрес электронной почты в MySQL «Строгие стандарты: только переменные должны передаваться по ссылке» error Форматировать код MySQL внутри строки PHP Получить информацию о подкатегориях, нажимая на родительскую категорию в CODEIGNITER Google_Service_Directory – (403) Не авторизовано для доступа к этому ресурсу / api Как запустить PHP-код, когда пользователь нажимает на ссылку?

Разбор текстового файла, содержащего данные изображения

я смог прочитать данные из текстового файла, используя 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( и отрубить последний символ для значений цвета.

Пример №1:

Если у вас несколько строк $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 ) ) 

Пример №2:

Если у вас есть однострочный $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 )