Как мне выполнить функцию PHP для каждой строки стандартного ввода?

Имея некоторый опыт работы с Linux, я привык к так называемым oneliners. Сегодня я хочу преобразовать некоторые HTML-мусор (сущности) в обычный текст с html_entity_decode из основного PHP.

например

>> html_entity_decode( '>' )
'>'

По словам переводчика, это можно сделать с помощью -R вариант;

Использование: php [options] [-f] [-] [args...] (...) -R seq 10 | php -R 'echo fgets(STDIN);' 2 4 6 8 10

... как это часто бывает, постановка проблемы часто приводит к решению. Так что я разобрался с проблемой, когда писал этот вопрос. Стандарт in закрыт, потому что PHP закрывает дескрипторы открытых файлов после завершения (см. Освобождение ресурсов), и это отбрасывает каждую вторую строку из-за некоторых интересных деталей реализации.

Спасибо за чтение, вы всегда можете сыграть в мой выбор, если хотите...


Часть о закрытии файловых дескрипторов автоматически выводится, потому что переменные выходят из области видимости, так как основной извлекается из стека выполнения. Я до сих пор не нашел это на php.net.

1 ответ

Держите стандарт открытым, читайте все строки одним скриптом (iirc, как в аналогичном Perl oneliner);

wget https://www.mountaingoatsoftware.com/agile/user-stories -O- |
    html2text -nobs -style pretty -width 120  |
    php -r 'while ($ii = fgets(STDIN))
                echo html_entity_decode($ii);'

Ура!

Другие вопросы по тегам