Grammatica italiana e regex - Un caso da asino

Parto subito con una citazione presa da qui:
http://www.accademiadellacrusca.it/it/lingua-italiana/consulenza-linguistica/domande-risposte/due-punti-alcuni-particolari-usi


"Relativamente al quesito se vi siano "casi in cui dopo i due punti si mettono le maiuscole (escludendo nomi propri e virgolettati)", come avverte il Manuale di redazione "di norma dopo i due punti si ha l'iniziale minuscola", tranne nel caso in cui essi introducano (oltre a una citazione o a un discorso diretto tra virgolette, come già anticipato) "un'elencazione i cui singoli elementi terminano con il punto" (p. 99)»."


Mi sono recentemente accorto di non aver prestato la necessaria attenzione nei vari articoli scritti online: non solo non ho rispettato la regola nelle "eccezioni" ma, qualche volta, ho pure scritto i due punti e la maiuscola seguendo regole inventate da me. Posso trovare un po' di giustificazioni, nel senso che nessuna grammatica italiana parla del caso dei due punti seguiti, da un'immagine centrata a capo, seguita da un testo, ma, in ultima analisi, l'unica conclusione che posso trarre è questa.

SI Exif

Vediamo allora come trasformare un asino, in un asino che sia almeno informatizzato.

Voglio correggere tutti i post scritti di wordpress andando a cercare la stringa due punti,  seguita da uno o più spazi, seguita poi da una lettera maiuscola. Una volta trovata andrò a mano a controllare se rispecchia i casi particolari di cui sopra.

Come spesso accade, se avessi fatto scorrere uno ad uno tutti i post facendo la correzione manuale, avrei risparmiato un sacco di tempo e fatica ma agire in maniera automatica (o semi-automatica) dà un sacco di soddisfazioni.

La strada più semplice è quella di effettuare una query sul database di wordpress che vada a cercare l'espressione regolare incriminata.

La tabella che andremo a leggere è wp_post (dove si trovano tutti i post e le pagine), andando a ricercare l'espressione regolare solo nei post e solo in quelli da un certo id in avanti (per limitare un po' i risultati).
L'espressione regolare (che chiamerò "asino") è molto semplice e consiste nei due punti,  seguiti da un numero arbitrario di spazi, seguiti da una o più lettere maiuscole.
Il risultato è l'id e il titolo dove c'è stato l'errore grammaticale.

Di base questo potrebbe bastare però purtroppo in moltissmi post ho inserito del codice all'interno dai tag <pre> </pre>. Chiaramente non è un errore grammaticale se trovo all' interno di uno script di shell o php i due punti seguiti da una maiuscola. La query qui sopra però guarda ovunque e devo quindi trovare un modo per escludere dalla ricerca le stringhe contenute nei tag pre.

Dovendo effettuare la manipolazione di una stringa e poi cercare la regexp "asino" sulla stringa manipolata mi creo un semplice  script php.

L'espressione regolare in php per cercare il contenuto dei tag pre è

(lo stile è quello di sed).
Cerco / il tag <pre>, seguito da 0 o più caratteri qualsiasi o 0 o più a capo (cosa che capita molto spesso),  seguti dal tag </pre>.

Effettuo il match su un intero post (ciclando ovviamente su tutti i post), colonna post_content

l'array $matches[0] viene popolato con tutte le stringe "matchate"  (in un post potenzialmente ci sono n tag pre e io le devo trovare tutte). $row_con("post_content") è il classico array che contiene la colonna post_content del db.

Con un ciclo "bovino" pulisco la stringa completa (il contenuto del post), togliendo (string replace con spazio bianco) tutte quelle parti comprese fra i tag pre, ovvero quelle di cui ho appena fatto il match.

ora la variabile $stringa conterrà il codice html del post privo dei contenuti fra tag pre. Non mi resta che effettuare il match con la regexp "asino" rivisitata per php

print_r($matches[0]) mi stampa a video la stringa/le stringe dove c'è l'errore grammaticale.

Il risultato sarà una cosa del genere

Il post che contiene tag pre numero 1234 non ha errori grammaticali.
Il post che contiene tag pre numero 5678 ha un sacco di potenziali errori grammaticali (8) e le stringe trovate sono ": N", ": M" etc.... Subito si può vedere che sicuramente ": USB" non è un errore in quanto è  una sigla che "si può scrivere" in maiuscolo.

 

 

Print Friendly, PDF & Email