Schema-tutorial
Schema-tutorialLes 6: Zoeken, vervangen en opnieuw opslaan

Les 6: Zoeken, vervangen en opnieuw opslaan

Deze tutorielles biedt voorbeelden van inhoudsaanpassingen waarbij gezocht en vervangen wordt, en de resource vervolgens opnieuw in de database wordt opgeslagen.

De extensie PHP Functions via Schema biedt de volgende velden voor "zoeken en vervangen":

  • _strReplace: Vervangt een string door een andere string
  • _strReplaceMultiple: Vervangt een lijst van strings door een andere lijst van strings
  • _strRegexReplace: Zoekt de te vervangen string met behulp van een reguliere expressie
  • _strRegexReplaceMultiple: Zoekt de te vervangen strings met behulp van een lijst van reguliere expressies
  • _strArrayReplace: Vervangt een string door een andere string in een array
  • _strArrayReplaceMultiple: Vervangt een lijst van strings door een andere lijst van strings in een array

Zoeken en vervangen in een string

Deze GraphQL query haalt een bericht op, vervangt alle voorkomens van een bepaalde string door een andere in de inhoud en titel van het bericht, en slaat het bericht vervolgens opnieuw op:

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

Om de query uit te voeren, geven we het woordenboek variables mee met de strings om te zoeken en te vervangen:

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

Zoeken en vervangen van meerdere strings

Dit is dezelfde query als hierboven, maar door gebruik te maken van _strReplaceMultiple kunnen we een lijst van strings vervangen door een andere lijst van 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
    }
  }
}

Het woordenboek variables ontvangt nu een lijst van strings om te zoeken en te vervangen:

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

Deze GraphQL query voert een regex zoeken en vervangen uit om ontbrekende links toe te voegen aan de HTML-inhoud van het bericht:

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

Alle URL's die niet zijn omgeven door een anchor-tag, zoals:

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

...krijgen de bijbehorende <a>-tag eromheen (waarbij ook het domein uit de tekst wordt verwijderd en een target wordt toegevoegd om in een nieuw venster te openen), en worden:

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

HTTP vervangen door HTTPS

Deze GraphQL query vervangt alle http-URL's door https in HTML-afbeeldingsbronnen:

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