Lección 6: Buscar, reemplazar y almacenar de nuevo
Esta lección del tutorial proporciona ejemplos de adaptaciones de contenido que involucran buscar y reemplazar, y luego almacenar el recurso de vuelta a la BD.
La extensión PHP Functions via Schema proporciona los siguientes campos de "buscar y reemplazar":
_strReplace: Reemplaza un string con otro string_strReplaceMultiple: Reemplaza una lista de strings con otra lista de strings_strRegexReplace: Busca el string a reemplazar usando una expresión regular_strRegexReplaceMultiple: Busca los strings a reemplazar usando una lista de expresiones regulares_strArrayReplace: Reemplaza un string con otro string en un array_strArrayReplaceMultiple: Reemplaza una lista de strings con otra lista de strings en un array
Buscar y reemplazar un string
Esta consulta GraphQL recupera una entrada, reemplaza todas las ocurrencias de algún string con otro en el contenido y título de la entrada, y almacena la entrada de nuevo:
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
}
}
}Para ejecutar la consulta, proporcionamos el diccionario de variables con los strings a buscar y reemplazar:
{
"postId": 1,
"replaceFrom": "Old string",
"replaceTo": "New string"
}Buscar y reemplazar múltiples strings
Esta es la misma consulta que la anterior, pero usando _strReplaceMultiple podemos reemplazar una lista de strings con otra lista de strings:
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
}
}
}El diccionario de variables ahora recibe una lista de strings a buscar y reemplazar:
{
"postId": 1,
"replaceFrom": ["Old string 2", "Old string 2"],
"replaceTo": ["New string1", "New string 2"]
}Añadiendo enlaces faltantes
Esta consulta GraphQL hace una búsqueda y reemplazo con regex para añadir enlaces faltantes en el contenido HTML de la entrada:
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
}
}
}Todas las URLs que no están rodeadas por una etiqueta anchor, como:
<p>Visit my website: https://mysite.com.</p>...se les añade la correspondiente etiqueta <a> a su alrededor (mientras también se elimina el dominio del texto, y se añade un target para abrir en una nueva ventana), quedando:
<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>- El carácter
"\"debe escaparse como"\\"dentro del patrón regex. Por ejemplo,"/^https?:\/\//"se escribe como"/^https?:\\/\\//" - La documentación para la función PHP
preg_replaceexplica cómo usar referencias de reemplazo (por ejemplo:$1) y modificadores PRCE.
Reemplazando HTTP con HTTPS
Esta consulta GraphQL reemplaza todas las URLs http con https en las fuentes de imágenes 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
}
}
}