如何为标准输入中的每一行执行PHP函数?

时间:2016-06-21 08:14:13

标签: php web-scraping garbage-collection filehandle

在Linux中有一些背景我已经习惯了这些所谓的oneliners。今天我想将一些HTML垃圾(实体)转换为来自核心PHP的html_entity_decode的纯文本。

e.g。

>> html_entity_decode( '>' )
'>'

根据口译员的帮助,可以使用-R选项;

来完成
  

用法:php [options] [-f] [ - ] [args ...]   (......)     -R< code>运行PHP< code>对于每个输入行   (...)

然而,通常当我认为PHP很棒时,它让我有理由不这样做(原谅态度);

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

......通常情况下,说明问题通常会导致解决方案。所以我在写这个问题时想出了问题。标准输入已关闭,因为PHP在终止时关闭打开的文件句柄(请参阅freeing resources),并且由于某些!enticing 实现细节而导致每隔一行丢弃。

感谢您的阅读,如果您愿意,您可以随时使用我的解决方案......

关于自动关闭文件句柄的部分是推断的,因为变量超出范围,因为 main从执行堆栈中弹出。我还没有在php.net上找到这个文档。

1 个答案:

答案 0 :(得分: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);'

Hooray!