Tutoriel du schéma
Tutoriel du schémaLeçon 6 : Rechercher, remplacer et stocker de nouveau

Leçon 6 : Rechercher, remplacer et stocker de nouveau

Cette leçon du tutoriel fournit des exemples d'adaptations de contenu impliquant la recherche et le remplacement, puis le stockage de la ressource de retour en base de données.

L'extension PHP Functions via Schema fournit les champs de « recherche et remplacement » suivants :

  • _strReplace : Remplace une chaîne par une autre chaîne
  • _strReplaceMultiple : Remplace une liste de chaînes par une autre liste de chaînes
  • _strRegexReplace : Recherche la chaîne à remplacer en utilisant une expression régulière
  • _strRegexReplaceMultiple : Recherche les chaînes à remplacer en utilisant une liste d'expressions régulières
  • _strArrayReplace : Remplace une chaîne par une autre chaîne dans un tableau
  • _strArrayReplaceMultiple : Remplace une liste de chaînes par une autre liste de chaînes dans un tableau

Rechercher et remplacer une chaîne

Cette requête GraphQL récupère un article, remplace toutes les occurrences d'une chaîne par une autre dans le contenu et le titre de l'article, et stocke l'article de nouveau :

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

Pour exécuter la requête, nous fournissons le dictionnaire de variables avec les chaînes à rechercher et à remplacer :

{
  "postId": 1,
  "replaceFrom": "Old string",
  "replaceTo": "New string"
}

Rechercher et remplacer plusieurs chaînes

C'est la même requête que ci-dessus, mais en utilisant _strReplaceMultiple nous pouvons remplacer une liste de chaînes par une autre liste de chaînes :

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

Le dictionnaire de variables reçoit maintenant une liste de chaînes à rechercher et à remplacer :

{
  "postId": 1,
  "replaceFrom": ["Old string 2", "Old string 2"],
  "replaceTo": ["New string1", "New string 2"]
}

Ajouter des liens manquants

Cette requête GraphQL effectue une recherche et un remplacement avec regex pour ajouter des liens manquants dans le contenu HTML de l'article :

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

Toutes les URLs qui ne sont pas entourées d'une balise anchor, comme :

<p>Visit my website: https://mysite.com.</p>

...se voient ajouter la balise <a> correspondante autour d'elles (tout en supprimant également le domaine du texte, et en ajoutant un target pour ouvrir dans une nouvelle fenêtre), devenant :

<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>

Remplacer HTTP par HTTPS

Cette requête GraphQL remplace toutes les URLs http par https dans les sources d'images 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
    }
  }
}