Pelajaran 6: Cari, ganti, dan simpan kembali
Pelajaran tutorial ini memberikan contoh adaptasi konten yang melibatkan pencarian dan penggantian, lalu menyimpan kembali sumber daya ke DB.
Ekstensi PHP Functions via Schema menyediakan field-field "cari dan ganti" berikut:
_strReplace: Mengganti sebuah string dengan string lain_strReplaceMultiple: Mengganti daftar string dengan daftar string lain_strRegexReplace: Mencari string yang akan diganti menggunakan ekspresi reguler_strRegexReplaceMultiple: Mencari string-string yang akan diganti menggunakan daftar ekspresi reguler_strArrayReplace: Mengganti sebuah string dengan string lain dalam sebuah array_strArrayReplaceMultiple: Mengganti daftar string dengan daftar string lain dalam sebuah array
Cari dan ganti sebuah string
Query GraphQL ini mengambil sebuah post, mengganti semua kemunculan suatu string dengan string lain pada konten dan judul post, lalu menyimpan post tersebut kembali:
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
}
}
}Untuk menjalankan query, kita menyediakan kamus variables dengan string-string yang akan dicari dan diganti:
{
"postId": 1,
"replaceFrom": "Old string",
"replaceTo": "New string"
}Cari dan ganti beberapa string
Ini adalah query yang sama seperti di atas, namun dengan menggunakan _strReplaceMultiple kita dapat mengganti daftar string dengan daftar string lain:
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
}
}
}Kamus variables kini menerima daftar string yang akan dicari dan diganti:
{
"postId": 1,
"replaceFrom": ["Old string 2", "Old string 2"],
"replaceTo": ["New string1", "New string 2"]
}Menambahkan tautan yang hilang
Query GraphQL ini melakukan pencarian dan penggantian dengan regex untuk menambahkan tautan yang hilang pada konten HTML 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
}
}
}Semua URL yang tidak dikelilingi tag anchor, seperti:
<p>Visit my website: https://mysite.com.</p>...akan ditambahkan tag <a> yang sesuai di sekelilingnya (sekaligus menghapus domain dari teks, dan menambahkan target untuk membuka di jendela baru), menjadi:
<p>Visit my website: <a href="https://mysite.com" target="_blank">mysite.com</a>.</p>- Karakter
"\"harus di-escape sebagai"\\"di dalam pola regex. Misalnya,"/^https?:\/\//"ditulis sebagai"/^https?:\\/\\//" - Dokumentasi untuk fungsi PHP
preg_replacemenjelaskan cara menggunakan referensi penggantian (mis:$1) dan modifier PRCE.
Mengganti HTTP dengan HTTPS
Query GraphQL ini mengganti semua URL http dengan https pada sumber gambar 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
}
}
}