This tutorial lesson provides examples of content adaptations involving search and replace, and then storing the resource back to the DB.
The PHP Functions via Schema extension provides the following "search and replace" fields:
_strReplace
: Replace a string with another string
_strReplaceMultiple
: Replace a list of strings with another list of strings
_strRegexReplace
: Search for the string to replace using a regular expression
_strRegexReplaceMultiple
: Search for the strings to replace using a list of regular expressions
This GraphQL query retrieves a post, replaces all occurrences of some string with another one in the post's content and title, and stores the post again:
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
}
}
}
Copy
To execute the query, we provide the dictionary of variables
with the strings to search and replace:
{
"postId" : 1 ,
"replaceFrom" : "Old string" ,
"replaceTo" : "New string"
}
Copy
This is the same query as above, but by using _strReplaceMultiple
we can replace a list of strings with another list of 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
}
}
}
Copy
The dictionary of variables
now receives a list of strings to search and replace:
{
"postId" : 1 ,
"replaceFrom" : [ "Old string 2" , "Old string 2" ],
"replaceTo" : [ "New string1" , "New string 2" ]
}
Copy
This GraphQL query does a regex search and replace to add missing links in the post's HTML content:
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
}
}
}
Copy
All URLs which are not surrounded by an anchor tag, such as:
< p >Visit my website: https://mysite.com.</ p >
Copy
...are added the corresponding <a>
tag around them (while also removing the domain from the text, and adding a target
to open in a new window), becoming:
< p >Visit my website: < a href = "https://mysite.com" target = "_blank" >mysite.com</ a >.</ p >
Copy
This GraphQL query replaces all http
URLs with https
in HTML image sources:
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
}
}
}
Copy