Ho bisogno di fare alcune attività di elaborazione del testo con brevi frammenti XML . La sezione "dettagli" mostra un esempio ... La mia soluzione è usare un tokenizzatore basato su espressioni regolari , ma non è elegante e non usa alcuna funzione di build-in . Le funzioni di build-in candidate (che altri mi indicano) sono strtok e SimpleXML
Quindi, la mia domanda ha due parti:
-
Le mie ipotesi sono corrette? Non ci sono altri "candidati", solo strtok e SimpleXML? È corretto ritenere DomDocument un "elefante" (con un grande sovraccarico della CPU) per una semplice attività di elaborazione del testo ?
-
Come utilizzare SimpleXML per svolgere la stessa attività (illustrata)? PS: non ho bisogno di tutti gli algoritmi o implementazione, solo alcuni indizi.
Dettagli
PHP offre un tokenizer, strtok , molto semplice, e non vedo come usarlo con Stringa XML. L'opzione SimpleXML , è forse pesante per attività come '' elaborazione del testo '' (vedi questo esempio e il sotto), ed è più di un tokenizer.
Che cosa voglio dire esattamente con "tokenizer" e "text processing"? Vedi l'esempio qui sotto. Ho usato un "parser regex", ma vorrei un algoritmo basato su alcune funzioni incorporate come SimpleXML, se è più semplice e veloce .
$xmlFrag = '
<p align="center"> Hello world!</p>
<p class="test"><i> Beautiful</i> day today.</p>';
// TOKENIZING TAGS AND ENTITIES:
$reg=array();
$xmlFrag = preg_replace_callback(
'/<!\-\-.+?\-\->|<.+?>|&[a-z0-9]+;/is',
function ($m) {
global $reg; $reg[]=$m[0]; $n=count($reg)-1;
return "##$n#";
},
$xmlFrag
);
echo $xmlFrag; // results:
// ##0###1# Hello world!##2# ##3###4###5# Beautiful##6# day today.##7#
// PROCESS THE TEXT: any, in one step. Example: lower, upper, change orthography, etc.
$xmlFrag = strtoupper($xmlFrag);
echo $xmlFrag;
// ##0###1# HELLO WORLD!##2# ##3###4###5# BEAUTIFUL##6# DAY TODAY.##7#
// EXPAND TOKENS:
$xmlFrag = preg_replace_callback(
'/##([0-9]+)#/is',
function ($m) { global $reg; return $reg[$m[1]]; },
$xmlFrag
);
echo $xmlFrag;
// <p align="center"> HELLO WORLD!</p>
// <p class="test"><i> BEAUTIFUL</i> DAY TODAY.</p>
Uso di SimpleXML
Come implementare un algoritmo SimpleXML per risolvere il problema illustrato (codice sopra)? PROBLEMI:
- Carica un XML con entità denominate (come
nell'esempio). - Attraversa l'XML per ottenere solo nodi di testo. Con
$sx->xpath('//text()');
non posso modificare i nodi.
Utilizzo di DomDocument
È fuori dal contesto, perché i miei frammenti XML sono brevi e DomDocument impone un grande sovraccarico di CPU (? è questo un preconcetto?) per la semplice elaborazione del testo.