Lekcja 6: Wyszukaj, zamień i zapisz ponownie
Ta lekcja samouczka zawiera przykłady adaptacji treści obejmujące wyszukiwanie i zamianę, a następnie ponowne zapisanie zasobu do bazy danych.
Rozszerzenie PHP Functions via Schema udostępnia następujące pola "wyszukaj i zamień":
_strReplace: Zastępuje jeden ciąg znaków innym ciągiem_strReplaceMultiple: Zastępuje listę ciągów znaków inną listą ciągów_strRegexReplace: Wyszukuje ciąg do zastąpienia za pomocą wyrażenia regularnego_strRegexReplaceMultiple: Wyszukuje ciągi do zastąpienia za pomocą listy wyrażeń regularnych_strArrayReplace: Zastępuje ciąg znaków innym ciągiem w tablicy_strArrayReplaceMultiple: Zastępuje listę ciągów znaków inną listą ciągów w tablicy
Wyszukaj i zamień ciąg znaków
Ta query GraphQL pobiera post, zastępuje wszystkie wystąpienia danego ciągu znaków innym ciągiem w treści i tytule posta, a następnie zapisuje post ponownie:
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
}
}
}Aby wykonać query, podajemy słownik variables z ciągami do wyszukania i zamiany:
{
"postId": 1,
"replaceFrom": "Old string",
"replaceTo": "New string"
}Wyszukaj i zamień wiele ciągów znaków
To jest ta sama query co powyżej, ale używając _strReplaceMultiple możemy zastąpić listę ciągów znaków inną listą ciągów:
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
}
}
}Słownik variables przyjmuje teraz listę ciągów znaków do wyszukania i zamiany:
{
"postId": 1,
"replaceFrom": ["Old string 2", "Old string 2"],
"replaceTo": ["New string1", "New string 2"]
}Dodawanie brakujących linków
Ta query GraphQL wykonuje wyszukiwanie i zamianę za pomocą wyrażenia regularnego, aby dodać brakujące linki w treści HTML posta:
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
}
}
}Wszystkie adresy URL, które nie są otoczone tagiem anchor, takie jak:
<p>Visit my website: https://mysite.com.</p>...otrzymują odpowiedni tag <a> wokół nich (przy jednoczesnym usunięciu domeny z tekstu i dodaniu atrybutu target otwierającego w nowym oknie), stając się:
<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>- Znak
"\"musi być escapowany jako"\\"wewnątrz wzorca regex. Na przykład"/^https?:\/\//"jest zapisywany jako"/^https?:\\/\\//" - Dokumentacja funkcji PHP
preg_replacewyjaśnia, jak używać odwołań do podstawień (np.$1) i modyfikatorów PRCE.
Zastępowanie HTTP przez HTTPS
Ta query GraphQL zastępuje wszystkie adresy URL http przez https w źródłach obrazów 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
}
}
}