Comment faire pour exécuter Ruby/Python scripts à partir de l'intérieur de PHP transmission et la réception des paramètres?

J'ai besoin de tourner HTML en équivalent Markdown-texte structuré.

OBS.: Rapide et clair de la façon de le faire avec PHP & Python.

Comme je suis à la programmation en PHP, certaines personnes indique Markdownify pour faire le travail, mais malheureusement, le code n'est pas mis à jour et en fait il n'est pas de travail. Au sourceforge.net/projects/markdownify il y a une "REMARQUE: non pris en charge - voulez-vous entretenir de ce projet? contactez-moi! Markdownify est un code HTML pour Markdown convertisseur écrit en PHP. Le voir comme le successeur de html2text.php depuis il a une meilleure conception, de meilleures performances et moins de cas de coin."

De ce que j'ai pu découvrir, je n'ai que deux choix:

  • Python: Aaron Swartz est html2text.py

  • Ruby: Singpolyma de html2markdown.rb, basé sur Nokogiri

Donc, à partir de PHP, j'ai besoin de passer le code HTML, appelez le Ruby/Python Script et de recevoir la sortie arrière.

(En passant, un peuple en fait une question similaire ici ("comment appeler ruby script en php?") mais en l'absence de renseignements pour mon cas).

La suite de l'Homme de fer-blanc du conseil (ci-dessous), je suis arrivé à ceci:

Code PHP:

$t='<p><b>Hello</b><i>world!</i></p>';
$scaped=preg_quote($t,"/");
$program='python html2md.py';

//exec($program.' '.$scaped,$n); print_r($n); exit; //Works!!!

$input=$t;

$descriptorspec=array(
   array('pipe','r'),//stdin is a pipe that the child will read from
   array('pipe','w'),//stdout is a pipe that the child will write to
   array('file','./error-output.txt','a')//stderr is a file to write to
);

$process=proc_open($program,$descriptorspec,$pipes);

if(is_resource($process)){
    fwrite($pipes[0],$input);
    fclose($pipes[0]);
    $r=stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $return_value=proc_close($process);
    echo "command returned $return_value\n";
    print_r($pipes);
    print_r($r);
}

Code Python:

#! /usr/bin/env python
import html2text
import sys
print html2text.html2text(sys.argv[1])
#print "Hi!" #works!!!

Ci-dessus, je suis geting ce:

commande retournée 1
Tableau
(
[0] => Ressource id #17
Un => Ressource id #18
)

Et l' "error-output.txt" fichier dit:

Traceback (most recent call last):
Fichier "html2md.py", line 5, in
imprimer html2text.html2text(sys.argvUn)
IndexError: list index out of range

Des idées???


Code Ruby (encore être analysé)

#!/usr/bin/env ruby
require_relative 'html2markdown'
puts HTML2Markdown.new("<h1>#{ ARGF.read }</h1>").to_s

Juste pour les enregistrements, j'ai essayé avant d'utiliser le PHP est plus simple "exec()" mais j'ai un peu de problemas avec certains caractères spéciaux très commun pour le langage HTML.

Code PHP:

echo exec('./hi.rb');
echo exec('./hi.py');

Code Ruby:

#!/usr/bin/ruby
puts "Hello World!"

Code Python:

#!usr/bin/python
import sys
print sys.argv[1]

Les deux fonctionne très bien. Mais, quand la chaîne est un peu plus compliqué:

$h='<p><b>Hello</b><i>world!</i></p>';
echo exec("python hi.py $h");

Il ne fonctionne pas à tous.

C'est parce que la chaîne html il est nécessaire de disposer de caractères spéciaux scaped. Je l'ai eu en utilisant ceci:

$t='<p><b>Hello</b><i>world!</i></p>';
$scaped=preg_quote($t,"/");

Maintenant il fonctionne comme je l'ai dit ici.

Je suis de running:
Fedora 14
ruby 1.8.7
Python 2.7
perl 5.12.2
PHP 5.3.4
nginx 0.8.53

double possible de ADM démarque de l'éditeur HTML pour les Démarques de conversion suggère Markdownify pour convertir de HTML avec PHP Markdown.
Eh bien, ils sont en train de discuter de choses différentes sur "ADM démarque de l'éditeur HTML pour les Démarques de conversion", même si elles sont en fait en essayant de tourner HTML en Markdown. Notez également que ce sujet n'est toujours pas résolue et qu'il n'y a pas un bon programme PHP qui font le travail. "Markdownify" est mentionné, mais en fait le projet ont été laissés par l'auteur et le code ne fonctionne pas.
En essayant de passer la chaîne à être modifiée sur la ligne de commande est très fragile solution et peuvent se casser facilement.
Si il y a une meilleure façon de faire cela à l'aide de PHP "exec()", alors je suis d'accord avec vous, ce n'est pas une solution.

OriginalL'auteur Roger | 2011-01-06