Schema-Tutorial
Schema-TutorialLektion 6: Suchen, ersetzen und erneut speichern

Lektion 6: Suchen, ersetzen und erneut speichern

Diese Tutorial-Lektion zeigt Beispiele für Inhaltsanpassungen mit Suchen und Ersetzen und anschließendem Speichern der Ressource in der DB.

Die Erweiterung PHP Functions via Schema stellt folgende Felder für „Suchen und Ersetzen" bereit:

  • _strReplace: Ersetzt eine Zeichenkette durch eine andere Zeichenkette
  • _strReplaceMultiple: Ersetzt eine Liste von Zeichenketten durch eine andere Liste von Zeichenketten
  • _strRegexReplace: Sucht die zu ersetzende Zeichenkette mithilfe eines regulären Ausdrucks
  • _strRegexReplaceMultiple: Sucht die zu ersetzenden Zeichenketten mithilfe einer Liste von regulären Ausdrücken
  • _strArrayReplace: Ersetzt eine Zeichenkette durch eine andere Zeichenkette in einem Array
  • _strArrayReplaceMultiple: Ersetzt eine Liste von Zeichenketten durch eine andere Liste von Zeichenketten in einem Array

Eine Zeichenkette suchen und ersetzen

Diese GraphQL-Query ruft einen Beitrag ab, ersetzt alle Vorkommen einer Zeichenkette durch eine andere im Inhalt und Titel des Beitrags und speichert den Beitrag erneut:

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

Um die Query auszuführen, geben wir das Wörterbuch mit variables mit den zu suchenden und ersetzenden Zeichenketten an:

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

Mehrere Zeichenketten suchen und ersetzen

Dies ist dieselbe Query wie oben, aber mit _strReplaceMultiple können wir eine Liste von Zeichenketten durch eine andere Liste von Zeichenketten ersetzen:

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

Das Wörterbuch mit variables erhält nun eine Liste von Zeichenketten zum Suchen und Ersetzen:

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

Diese GraphQL-Query führt eine Regex-Suche und -Ersetzung durch, um fehlende Links im HTML-Inhalt des Beitrags hinzuzufügen:

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 URLs, die nicht von einem Anchor-Tag umgeben sind, wie:

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

...erhalten das entsprechende <a>-Tag darum herum (dabei wird auch die Domain aus dem Text entfernt und ein target hinzugefügt, um in einem neuen Fenster zu öffnen), sodass sie zu folgendem werden:

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

HTTP durch HTTPS ersetzen

Diese GraphQL-Query ersetzt alle http-URLs durch https in HTML-Bildquellen:

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