Tutorial del esquema
Tutorial del esquemaLección 6: Buscar, reemplazar y almacenar de nuevo

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>

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
    }
  }
}