Lição 6: Buscar, substituir e salvar novamente
Esta lição do tutorial fornece exemplos de adaptações de conteúdo envolvendo busca e substituição, e o posterior armazenamento do recurso de volta no banco de dados.
A extensão PHP Functions via Schema fornece os seguintes campos de "busca e substituição":
_strReplace: Substitui uma string por outra string_strReplaceMultiple: Substitui uma lista de strings por outra lista de strings_strRegexReplace: Busca a string a ser substituída usando uma expressão regular_strRegexReplaceMultiple: Busca as strings a serem substituídas usando uma lista de expressões regulares_strArrayReplace: Substitui uma string por outra string em um array_strArrayReplaceMultiple: Substitui uma lista de strings por outra lista de strings em um array
Buscar e substituir uma string
Esta query GraphQL recupera um post, substitui todas as ocorrências de uma string por outra no conteúdo e no título do post, e armazena o post novamente:
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
}
}
}Para executar a query, fornecemos o dicionário de variables com as strings a buscar e substituir:
{
"postId": 1,
"replaceFrom": "Old string",
"replaceTo": "New string"
}Buscar e substituir múltiplas strings
Esta é a mesma query acima, mas usando _strReplaceMultiple podemos substituir uma lista de strings por outra lista de 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
}
}
}O dicionário de variables agora recebe uma lista de strings a buscar e substituir:
{
"postId": 1,
"replaceFrom": ["Old string 2", "Old string 2"],
"replaceTo": ["New string1", "New string 2"]
}Adicionando links ausentes
Esta query GraphQL realiza uma busca e substituição com regex para adicionar links ausentes no conteúdo HTML do post:
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
}
}
}Todos os URLs que não estão envolvidos por uma tag anchor, como:
<p>Visit my website: https://mysite.com.</p>...recebem a tag <a> correspondente ao redor deles (removendo também o domínio do texto e adicionando um target para abrir em uma nova janela), tornando-se:
<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>- O caractere
"\"deve ser escapado como"\\"dentro do padrão regex. Por exemplo,"/^https?:\/\//"é escrito como"/^https?:\\/\\//" - A documentação da função PHP
preg_replaceexplica como usar referências de substituição (ex:$1) e modificadores PRCE.
Substituindo HTTP por HTTPS
Esta query GraphQL substitui todos os URLs http por https em fontes de imagens HTML:
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
}
}
}