2009-12-28 5 views
1

Aussi dur que j'essaie, PREG, et je ne suis pas le long, donc, j'espère de vous gourous PHP peut aider ..PHP PREG Question

J'ai un code HTML à venir dans un Script PHP, et j'ai besoin d'éléments spécifiques supprimés/supprimés du code source.

Première, si cela vient dans le cadre de HTML (peut-être plusieurs instances):

<SPAN class=placeholder title="" jQuery1262031390171="46">[[[SOMETEXT]]]</SPAN> 

je le veux converti en simplement [[[someText]]]

Remarque que le préfixe sera toujours (je pense):

<SPAN class=placeholder 

.. et le suffixe sera toujours

</SPAN> 

(oui, capitale SPAN), mais le titre = "" et ### jQuery = "#" pièces peuvent être différentes. [[[SOMETEXT]]] peut être n'importe quoi. Je veux essentiellement que la balise SPAN soit supprimée.

Ensuite, si cela vient dans le cadre du HTML (pourrait également être plusieurs instances):

<span style="" class="placeholder" title="">[[[SOMETEXT]]</span> 

.. même chose - je veux juste le [[[someText]]] partie rester. Je pense que pièce sera toujours préfixe, et (dans ce cas, minuscules span tags) sera suffixe.

Je comprends cela peut probablement prendre deux commandes PREG, mais aimerait pouvoir passer dans le texte html en fonction et obtenir une version nettoyée/dénudée, quelque chose comme ceci:

$dirty_text = $_POST['html_text']; 
$clean_text = strip_placeholder_spans($dirty_text); 
function strip_placeholder_spans($in_text) { 
// all the preg magic happens here, and returns result 
} 

AJOUTÉE/MIS À JOUR POUR LA CLARTÉ

Ok, obtenir de bons commentaires, et se rapprocher. Cependant, pour le rendre plus clair, voici un exemple. Je veux envoyé ce texte dans la fonction strip_placeholder_spans():

<blockquote> 
<h2 align="center">Firefox: <span class="placeholder" title="">[[[ITEM1]]]</span></h2> 
<h2 align="center">IE1:<SPAN class=placeholder title="" jQuery1262031390171="46">[[[ITEM2]]]</SPAN> 
</h2> 
<h2 align="center">IE2:<SPAN class=placeholder title="" jQuery1262031390412="52">[[[ITEM3]]]</SPAN> 
</h2> 
<h2 align="center"><br><font face="Arial, Helvetica, sans-serif">COMPLETE</font></h2> 
<p align="center">Your Text Can Go Here</p> 
<p align="center"><a href="javascript:self.close()">Close this Window</a></p> 
<p align="center"><br></p> 
<p align="center"><a href="javascript:self.close()"><br></a></p></blockquote> 
<p align="center"></p> 

et quand il revient, il devrait être le suivant:

<blockquote> 
<h2 align="center">Firefox: [[[ITEM1]]]</h2> 
<h2 align="center">IE1:[[[ITEM2]]]</h2> 
<h2 align="center">IE2:[[[ITEM3]]]</h2> 
<h2 align="center"><br><font face="Arial, Helvetica, sans-serif">COMPLETE</font></h2> 
<p align="center">Your Text Can Go Here</p> 
<p align="center"><a href="javascript:self.close()">Close this Window</a></p> 
<p align="center"><br></p> 
<p align="center"><a href="javascript:self.close()"><br></a></p></blockquote> 
<p align="center"></p> 
+2

Ici, nous allons à nouveau sur l'analyse des balises HTML avec des expressions régulières ... S'il vous plaît voir cette réponse - http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contenu- tags/1732454 # 1732454 – LiraNuna

+0

Parsing Html Le Cthulhu Way: http://www.codinghorror.com/blog/archives/001311.html –

+0

Ici, nous allons à nouveau avec la position "html + regex is evil." Ne pas essayer go PARSE HTML ici LiraNuna - juste vouloir rechercher et remplacer du texte.Ne voulez pas utiliser une scie électrique pour couper un cure-dent.S'il aide, prétendre qu'il n'y a pas de < and > symboles dans le texte – OneNerd

Répondre

1

Utilisez un Parse HTML. C'est la solution la plus robuste. Le code suivant fonctionnera pour les deux exemples de code que vous avez publiés:

$s= <<<STR 
<span style="" class="placeholder" title="">[[[SOMETEXT]]</span> 
Some Other text &amp; <b>Html</b> 
<SPAN class=placeholder title="" jQuery1262031390171="46">[[[SOMETEXT]]]</SPAN> 
STR; 

preg_match_all('/\<span[^>]+?class="*placeholder"*[^>]+?>([^<]+)?<\/span>/isU', $s, $m); 
var_dump($m); 

L'utilisation d'expressions régulières génère un code très concentré. Cet exemple ne traitera que du HTML très spécifique et du HTML bien formé. Par exemple, il n'analysera pas <span class="placeholder">some text < more text</span>. Si vous avez le contrôle sur le HTML source, cela peut suffire.

+0

J'ai converti votre preg_match_all en un preg_replace, et il semble faire ce dont j'ai besoin. Merci - – OneNerd

1

Première étape: supprimer les expressions régulières de votre boîte à outils en traitant avec HTML. Vous avez besoin d'un analyseur.

Étape 2: Télécharger simple_html_dom pour php.

Troisième étape: Parse

$html = str_get_html('<SPAN class=placeholder title="" jQuery1262031390171="46">[[[SOMETEXT]]]</SPAN>'); 
$spanText = $html->find('span', 1)->innerText; 

Quatrième étape: le profit!

Modifier

$html->find('span.placeholder', 1)->tag, $matches); retournera ce que vous voulez. Il cherche class = placeholder.

+0

Byron - je ne sais pas savoir à l'avance le titre ou la requête ### = "#" morceau - un moyen d'émettre des caractères génériques sur ceux-ci? – OneNerd

+0

Vous avez dit que vous voulez dépouiller la durée, ne pas garder les attributs? – LiraNuna

+0

veux juste la pièce [[[SOMETEXT]]] pour rester, tout le reste peut y aller. – OneNerd

1

Je pense que cela devrait résoudre votre Poble

function strip_placeholder_spans($in_text) { 
preg_match("/>(.*?)<\//", $in_text, $result); 
return $result[1]; } 
+0

hmm - pas un expert, mais ne serait-ce pas enlever toutes les balises? – OneNerd

+0

oh oui désolé, mal compris la question, vous voulez seulement bande span, alors vous pouvez utiliser, fonction strip_placeholder_spans ($ in_text) { preg_match ("/ (. *?) <\/span> /", $ dans le texte, $ résultat); return $ result [2]; } Je ne suis pas sûr que je l'ai bien compris, je suis un peu confus waht que vous vouliez – marvin