Lezione 6: Cerca, sostituisci e salva di nuovo
Questa lezione del tutorial fornisce esempi di adattamenti di contenuto che prevedono la ricerca e la sostituzione, e il successivo salvataggio della risorsa nel DB.
L'estensione PHP Functions via Schema fornisce i seguenti campi di "ricerca e sostituzione":
_strReplace: Sostituisce una stringa con un'altra stringa_strReplaceMultiple: Sostituisce un elenco di stringhe con un altro elenco di stringhe_strRegexReplace: Cerca la stringa da sostituire utilizzando un'espressione regolare_strRegexReplaceMultiple: Cerca le stringhe da sostituire utilizzando un elenco di espressioni regolari_strArrayReplace: Sostituisce una stringa con un'altra stringa in un array_strArrayReplaceMultiple: Sostituisce un elenco di stringhe con un altro elenco di stringhe in un array
Cerca e sostituisci una stringa
Questa query GraphQL recupera un articolo, sostituisce tutte le occorrenze di una stringa con un'altra nel contenuto e nel titolo dell'articolo, e salva nuovamente l'articolo:
query GetPostData(
$postId: ID!
$replaceFrom: String!,
$replaceTo: String!
) {
post(by: { id: $postId }) {
title
adaptedPostTitle: _strReplace(
search: $replaceFrom
replaceWith: $replaceTo
in: $__title
)
@export(as: "adaptedPostTitle")
rawContent
adaptedRawContent: _strReplace(
search: $replaceFrom
replaceWith: $replaceTo
in: $__rawContent
)
@export(as: "adaptedRawContent")
}
}
mutation UpdatePost($postId: ID!)
@depends(on: "GetPostData")
{
updatePost(input: {
id: $postId,
title: $adaptedPostTitle,
contentAs: { html: $adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
title
rawContent
}
}
}Per eseguire la query, forniamo il dizionario di variables con le stringhe da cercare e sostituire:
{
"postId": 1,
"replaceFrom": "Old string",
"replaceTo": "New string"
}Cerca e sostituisci più stringhe
È la stessa query di cui sopra, ma utilizzando _strReplaceMultiple possiamo sostituire un elenco di stringhe con un altro elenco di stringhe:
query GetPostData(
$postId: ID!
$replaceFrom: [String!]!,
$replaceTo: [String!]!
) {
post(by: { id: $postId }) {
title
adaptedPostTitle: _strReplaceMultiple(
search: $replaceFrom
replaceWith: $replaceTo
in: $__title
)
@export(as: "adaptedPostTitle")
rawContent
adaptedRawContent: _strReplaceMultiple(
search: $replaceFrom
replaceWith: $replaceTo
in: $__rawContent
)
@export(as: "adaptedRawContent")
}
}
mutation UpdatePost($postId: ID!)
@depends(on: "GetPostData")
{
updatePost(input: {
id: $postId,
title: $adaptedPostTitle,
contentAs: { html: $adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
title
rawContent
}
}
}Il dizionario di variables riceve ora un elenco di stringhe da cercare e sostituire:
{
"postId": 1,
"replaceFrom": ["Old string 2", "Old string 2"],
"replaceTo": ["New string1", "New string 2"]
}Aggiungere link mancanti
Questa query GraphQL esegue una ricerca e sostituzione con regex per aggiungere link mancanti nel contenuto HTML dell'articolo:
query GetPostData($postId: ID!) {
post(by: { id: $postId }) {
id
rawContent
adaptedRawContent: _strRegexReplace(
searchRegex: "#\\s+((https?)://(\\S*?\\.\\S*?))([\\s)\\[\\]{},;\"\\':<]|\\.\\s|$)#i"
replaceWith: "<a href=\"$1\" target=\"_blank\">$3</a>$4"
in: $__rawContent
)
@export(as: "adaptedRawContent")
}
}
mutation UpdatePost($postId: ID!)
@depends(on: "GetPostData")
{
updatePost(input: {
id: $postId,
contentAs: { html: $adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
title
rawContent
}
}
}Tutti gli URL non circondati da un tag anchor, come:
<p>Visit my website: https://mysite.com.</p>...ricevono il corrispondente tag <a> attorno ad essi (rimuovendo anche il dominio dal testo e aggiungendo un target per aprire in una nuova finestra), diventando:
<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>- Il carattere
"\"deve essere preceduto da un escape come"\\"nel pattern regex. Ad esempio,"/^https?:\/\//"si scrive"/^https?:\\/\\//" - La documentazione della funzione PHP
preg_replacespiega come utilizzare i riferimenti di sostituzione (es:$1) e i modificatori PRCE.
Sostituire HTTP con HTTPS
Questa query GraphQL sostituisce tutti gli URL http con https nelle sorgenti delle immagini HTML:
query GetPostData($postId: ID!) {
post(by: {id: $postId}) {
id
rawContent
adaptedRawContent: _strRegexReplace(
searchRegex: "/<img(\\s+)?([^>]*?\\s+?)?src=([\"'])http:\\/\\/(.*?)/"
replaceWith: "<img$1$2src=$3https://$4$3"
in: $__rawContent
)
@export(as: "adaptedRawContent")
}
}
mutation UpdatePost($postId: ID!)
@depends(on: "GetPostData")
{
updatePost(input: {
id: $postId,
contentAs: { html: $adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
title
rawContent
}
}
}