2015-08-11 4 views
2

Я разбираю shell_exec, для которого я получаю серию строк результатов, которые я сравниваю с данными из других источников.Сравнение цветных строк PHP

Текст оболочки ввода содержит цветной текст ANSI, который я не могу разобрать. В результате я не могу выполнить базовое сравнение строк, не говоря уже о in_array, как я и планировал.

Я попытался использовать preg_replace с числом классов PCRE (печать, CNTRL и т.д.), а также более простые вещи, как strcmp и strtolower, все без толку.

Уверен, что мне не хватает чего-то глупого, но я не смог понять, какую тупую вещь мне не хватает.

+3

Вы можете показать нам строки? –

+0

Я не уверен, что бы это сделало, так как копирование/вставка их просто сделает это с помощью открытого текста. Но для назидания здесь есть эхо слева и справа: /var/www/eastwood-dev/r2/socket/server.js::/var/www/eastwood-dev/r2/socket/server.js –

+0

Быстро подумайте, пропустите вывод через 'cat -vet', который укроет escape-коды. – bishop

ответ

5

Чтобы отсеять ANSI последовательности:

preg_replace("/\e.*?[a-zA-Z]/", '', $str); 

Я считаю, что вы всегда будете иметь образец «побег, аргументы, команды», где команда алфавитный, аргументы числовые, разделенные двоеточием, если более чем один.

+0

Это не так. Я получаю это: '^ [[90m/var/www/eastwood-dev/r2/socket/server.js^[[39m ::/var/www/eastwood-dev/r2/socket/server.js $ ', который создается из этой строки:' echo trimEx ($ key). '::'. $ serverpath. "\ n"; 'И trimEx является' функцией trimEx ($ string) { return preg_replace ("/ \ e. *?;/", '', $ string) ;; } ' –

+0

Извините, я обновил вопрос через пару секунд после публикации, так как понял, что неправильно помню последовательности ANSI. Попробуйте обновить регулярное выражение. – Amadan

+0

Удивительно, это обновление имеет больше смысла ... но еще лучше, оно полностью работает. Понятия не имею, почему ничто другое, что я пробовал, не уничтожит его, но я рад, что мы нашли (вернее, вы передали мне) решение. –

1

Просто выбросьте это. cat -vet отлично подходит для диагностики, но иногда он отлично подходит для работы с не фарфоровым выходом прямолинейным способом.

уступи пагубным:

$output = shell_exec("$cmd | cat -vet"); 
$output = preg_replace('/\^\[\[\d+m/', '', $output); 

cat -vet является конвертирование экранирующие коды для отдельных печатаемых символов, которые вы можете иметь дело с, как собственно самих персонажей.

Если ваш результат имеет законные ^] и другие подобные последовательности, этот подход не будет работать. Лучше использовать PCRE, который соответствует фактическим escape-кодам, как в ответе @Amadan. Но если вам нужно что-то быстрое и грязное, это может сработать.

Смежные вопросы