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

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

например

>> html_entity_decode( '>' )
'>'

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

Использование: php [опции] [-f] [-] [аргументы …] (…)
-Р <код> запустить PHP <код> для каждой строки ввода
(…)

Однако часто, когда я думаю, что PHP великолепен, это дает мне повод думать иначе (извините за отношение);

seq 10  | php -R 'echo fgets(STDIN);'
2
4
6
8
10

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

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


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

2

Решение

Держите стандарт открытым, читайте все строки одним скриптом (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);'

Ура!

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]