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"]
}Fehlende Links hinzufügen
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>- Das Zeichen
"\"muss als"\\"im Regex-Muster escaped werden. Zum Beispiel wird"/^https?:\/\//"als"/^https?:\\/\\//"geschrieben - Die Dokumentation der PHP-Funktion
preg_replaceerklärt, wie man Ersetzungsreferenzen (z. B.:$1) und PRCE-Modifikatoren verwendet.
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
}
}
}