Leçon 6 : Rechercher, remplacer et stocker de nouveau
Cette leçon du tutoriel fournit des exemples d'adaptations de contenu impliquant la recherche et le remplacement, puis le stockage de la ressource de retour en base de données.
L'extension PHP Functions via Schema fournit les champs de « recherche et remplacement » suivants :
_strReplace: Remplace une chaîne par une autre chaîne_strReplaceMultiple: Remplace une liste de chaînes par une autre liste de chaînes_strRegexReplace: Recherche la chaîne à remplacer en utilisant une expression régulière_strRegexReplaceMultiple: Recherche les chaînes à remplacer en utilisant une liste d'expressions régulières_strArrayReplace: Remplace une chaîne par une autre chaîne dans un tableau_strArrayReplaceMultiple: Remplace une liste de chaînes par une autre liste de chaînes dans un tableau
Rechercher et remplacer une chaîne
Cette requête GraphQL récupère un article, remplace toutes les occurrences d'une chaîne par une autre dans le contenu et le titre de l'article, et stocke l'article de nouveau :
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
}
}
}Pour exécuter la requête, nous fournissons le dictionnaire de variables avec les chaînes à rechercher et à remplacer :
{
"postId": 1,
"replaceFrom": "Old string",
"replaceTo": "New string"
}Rechercher et remplacer plusieurs chaînes
C'est la même requête que ci-dessus, mais en utilisant _strReplaceMultiple nous pouvons remplacer une liste de chaînes par une autre liste de chaînes :
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
}
}
}Le dictionnaire de variables reçoit maintenant une liste de chaînes à rechercher et à remplacer :
{
"postId": 1,
"replaceFrom": ["Old string 2", "Old string 2"],
"replaceTo": ["New string1", "New string 2"]
}Ajouter des liens manquants
Cette requête GraphQL effectue une recherche et un remplacement avec regex pour ajouter des liens manquants dans le contenu HTML de l'article :
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
}
}
}Toutes les URLs qui ne sont pas entourées d'une balise anchor, comme :
<p>Visit my website: https://mysite.com.</p>...se voient ajouter la balise <a> correspondante autour d'elles (tout en supprimant également le domaine du texte, et en ajoutant un target pour ouvrir dans une nouvelle fenêtre), devenant :
<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>- Le caractère
"\"doit être échappé en"\\"dans le motif regex. Par exemple,"/^https?:\/\//"s'écrit"/^https?:\\/\\//" - La documentation de la fonction PHP
preg_replaceexplique comment utiliser les références de remplacement (ex. :$1) et les modificateurs PRCE.
Remplacer HTTP par HTTPS
Cette requête GraphQL remplace toutes les URLs http par https dans les sources d'images 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
}
}
}