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"]
}Ontbrekende links toevoegen
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>- Het teken
"\"moet worden geëscaped als"\\"binnen het regex-patroon. Bijvoorbeeld"/^https?:\/\//"wordt geschreven als"/^https?:\\/\\//" - De documentatie voor PHP-functie
preg_replacelegt uit hoe je vervangingsreferenties (bijv.$1) en PRCE-modifiers gebruikt.
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
}
}
}