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
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
Vous devez vous connecter pour publier un commentaire.
PHP ouvrir le Ruby ou Python script via
proc_open
, de la tuyauterie le code HTML sur STDIN dans le script. Le Ruby/Python script lit et traite les données et les renvoie par STDOUT au script PHP, puis se ferme. C'est une façon de faire les choses parpopen
les fonctionnalités de Perl, Ruby ou Python et c'est agréable car il vous donne accès à STDERR, en cas de coups morceaux et ne nécessite pas de fichiers temporaires, mais c'est un peu plus complexe.D'autres moyens de le faire pourrait être d'écrire les données à partir de PHP dans un fichier temporaire, puis à l'aide
system
,exec
, ou quelque chose de semblable à appeler le Ruby/Python script pour ouvrir et traiter, et de l'impression de la sortie en utilisant leur sortie standard (STDOUT).EDIT:
Voir @Jonke réponse pour les "Meilleures pratiques avec STDIN en Ruby?" pour des exemples de la façon dont il est facile de lire l'entrée standard STDIN et écrire sur la sortie standard avec Ruby. "Comment voulez-vous lire depuis l'entrée standard stdin en python" a quelques bons échantillons pour cette langue.
C'est un exemple simple montrant comment appeler un script Ruby, du passage d'une chaîne via PHP STDIN pipe, et la lecture du script Ruby est STDOUT:
L'enregistrer comme "test.php":
Enregistrer ce "test.rb":
Exécutant le script PHP donne:
Le script PHP est l'ouverture de l'interpréteur Ruby qui ouvre le script Ruby. PHP envoie ensuite "hello world". Ruby enveloppe le texte reçu en gras les balises, et les sorties, ce qui est capturé par PHP, et ensuite de sortie. Il n'y a pas de fichiers temporaires, rien n'est passé sur la ligne de commande, vous pourriez passer BEAUCOUP de données en cas de besoin-être, et il serait assez rapide. Python ou Perl peut facilement être utilisé à la place de Ruby.
EDIT:
Si vous avez:
l'exemple de code, alors vous pourriez commencer le développement d'un Rubis solution:
en supposant que vous avez déjà téléchargé le HTML2Markdown code et de le faire dans le répertoire courant et sont en cours d'exécution Ruby 1.9.2.
le PHP liens pour "proc_open", "système" et "exec" avoir un exemple de code en bas de la pages. Voir la modifier dans ma réponse pour les exemples de Ruby et PHP.
J'ai exécuté votre code et le résultat a été: "la commande a retourné 1". Il semble que "proc_open()" nous donne beaucoup plus de contrôle sur les données, bien que, comme je l'ai jamais utilisé, il semble assez confondre au premier abord. Je suis toujours en imaginant comment faire de Ruby (ou Python) processus de l'entrée HTML.
La sortie dit "
command returned 1
" parce que quelque chose n'a pas été fait correctement. Essayez d'exécuterecho 'foo' | ruby test.rb
à partir du même répertoire où vous avez enregistré le "test.rb" fichier. Vous devriez obtenir "<b>foo</b>
".Bien sûr, je l'ai eu: "<b>bonjour</b> commande retournée 0". Maintenant imaginer comment le faire produire à l'intérieur de Ruby ou Python.
OriginalL'auteur the Tin Man
En Python, PHP passer le var comme un argument de ligne de commande, l'obtenir à partir d'
sys.argv
(la liste des arguments de ligne de commande passé à Python), et ont ensuite imprimé Python la sortie, qui PHP puis l'écho. Exemple:PHP:
La procédure devraient être sensiblement les mêmes en Ruby.
Je vois ce que vous avez fait, et je ne suis pas sûr de ce que pourrait être l'origine de l'erreur. Quel est le résultat?
J'ai pris un coup d'oeil et le problème est la ! caractère; cela a une signification particulière pour le shell bash. Donc ce que vous pouvez faire est d'échapper les caractères spéciaux, ou choisir une solution plus robuste (je suis sûr qu'il y a des réductions de modules de PHP)
Comme je l'ai dit ci-dessus, si il n'y a aucune meilleure façon de le faire (passer le texte html à un autre programme) à l'aide de PHP "exec()", alors je suis d'accord avec vous, ce n'est pas une solution. En passant, je suis à la recherche d'un moyen de transformer le HTML en Markdown et non l'inverse.
vous devriez regarder dans Markdownify (milianw.de/projects/markdownify). Vous pouvez passer du texte à partir de PHP à Python et à l'arrière, mais il serait plus facile de simplement utiliser un module PHP.
OriginalL'auteur Rafe Kettler
Utiliser une variable dans le code Ruby, et de le transmettre en argument au script Ruby à partir du code PHP. Ensuite, le script Ruby retour le traité de code dans stdout qui PHP peut lire.
OriginalL'auteur Daniel Walker
Je pense que votre question est mal. Votre problème est comment faire pour convertir en HTML au format Markdown. Suis-je le droit?
Essayer cette http://milianw.de/projects/markdownify/ je pense qu'il pourrait vous aider =)
Evaldo, cela a résolu mon problème: stackoverflow.com/questions/4686842/...
OriginalL'auteur Evaldo Junior
Un autre très bizarre approche sera comme celui que j'ai utilisé.
Pas recommandé, mais cela fonctionne pour vous.
OriginalL'auteur Akif Hazarvi