# Auto-Linkify Words

**URL:** https://meta.discourse.org/t/auto-linkify-words/82193
**Category:** Theme component
**Tags:** official, linkify-words
**Created:** [3월 5, 2018, 7:16오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193 "2018-03-05T07:16:06Z")
**Posts on this page:** 20
**Page:** 11

<div class="post-metadata">

### Author: ![danekhollas](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/danekhollas/32/79637_2.png) [@danekhollas](https://meta.discourse.org/u/danekhollas)
#### Post date: [7월 28, 2022, 4:36오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/210 "2022-07-28T16:36:20Z")

</div>

@md-misko PR 올려줘서 감사합니다!

> [@md-misko](#):
>
> 불행히도 이 방법은 명시적으로 이 문자들(특히 링크를 만들 때 유용한 `ID.1`이나 `id2.5` 같은 약어에서 사용되는 `.`)을 포함하는 단어에 링크를 걸지 못하게 합니다.

정말 그런가요? 조금 놀랍네요. 정규 표현식이 충분히 탐욕(greedy)스럽다면 매칭할 수 있을 거라고 생각했습니다. 참고로 경계 문자에서 점을 제거하면 문장 끝의 단어에 링크를 걸지 못하게 됩니다.

아래에서 제공한 정규 표현식으로 regex101.com에서 간단히 테스트해 보았는데, 현재 경계 문자로는 잘 작동하는 것 같습니다. [regex101: build, test, and debug regex](https://regex101.com/r/MQSyKK/1) 참고로 의도를 제가 제대로 이해했다면, 캡처 그룹 중 일부를 `(?:)`를 사용하여 비캡처 그룹(non-capturing groups)으로 변경해야 할 수 있습니다.

> [@md-misko](#):
>
> 샘플 정규 표현식 규칙 (`id1.1`부터 `id10.100`까지 매칭하며, `id m.n`, `IDm.n`, `ID m.n` 변형 포함)

`|`를 사용할 수 없다는 점은 매우 번거롭죠, 동의합니다. 참고로 `ID|id` 부분은 정규 표현식을 대소문자 구분 없게(case insensitive) 만들기 위해 `i` 수정자(modifier)를 사용하면 됩니다. 숫자의 경우 1~10과 1~100 사이의 정확한 범위가 정말 필요하다면 처리가 까다롭지만, 1~19와 1~199로 범위를 넓히면 더 쉬워집니다. 🙂

제가 생각하기에 작동할 비캡처 그룹이 포함된 정규 표현식입니다.

```plaintext
/id\s?((?:[1-9]|10)\.(?:[1-9]|[1-9][0-9]|100))/i, https://example.com/id$2

```

---

<div class="post-metadata">

### Author: ![md-misko](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/md-misko/32/126315_2.png) [@md-misko](https://meta.discourse.org/u/md-misko)
#### Post date: [7월 29, 2022, 10:52오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/211 "2022-07-29T22:52:06Z")

</div>

@danekhollas 피드백과 정규식 감사합니다! 코멘트를 바탕으로 코드를 수정했고, PR은 리뷰 준비가 되었습니다.

---

<div class="post-metadata">

### Author: ![danekhollas](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/danekhollas/32/79637_2.png) [@danekhollas](https://meta.discourse.org/u/danekhollas)
#### Post date: [7월 30, 2022, 12:16오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/212 "2022-07-30T00:16:12Z")

</div>

좋아요! 다만 Discourse 팀의 누군가가 이를 검토해야 합니다. @sam 에게 CC 해주세요.

포크한 저장소에서 확장을 직접 설치할 수 있으며(브랜치도 지정할 수 있습니다).

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [7월 31, 2022, 9:11오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/215 "2022-07-31T21:11:43Z")

</div>

먼저 한 가지 설명을 드리고 싶은데, 왜 사용자들이 내장된 감시 단어 대신 해당 컴포넌트를 사용하나요?

---

<div class="post-metadata">

### Author: ![md-misko](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/md-misko/32/126315_2.png) [@md-misko](https://meta.discourse.org/u/md-misko)
#### Post date: [8월 1, 2022, 4:52오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/216 "2022-08-01T04:52:18Z")

</div>

> [@sam](#):
>
> 컴포넌트를 사용하는 것과 내장된 감시 단어(watched words)의 차이점?

내장된 감시 단어에 대해 두 가지 주요 문제를 발견했습니다.

- 복잡한 정규식을 추가할 수 없습니다: 오류 발생: 단어가 너무 깁니다 (최대 100자)
- 임의의 문자를 단어 경계로 사용할 수 없습니다: 특히 밑줄(\_)
- 또한 규칙을 편집하거나 실행 순서를 변경할 수 없는 것도 이상적입니다.

해당 컴포넌트의 PR은 단어 경계를 사용자에게 노출하며, 긴 정규식과 관련된 문제도 없습니다(| 사용 불가 문제는 PR에서 함께 다루고 있습니다).

그 외에는 감시 단어가 완벽하게 작동하므로, 이러한 사항들이 코어에서 해결될 수 있다면 적극 찬성합니다.

---

<div class="post-metadata">

### Author: ![md-misko](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/md-misko/32/126315_2.png) [@md-misko](https://meta.discourse.org/u/md-misko)
#### Post date: [8월 1, 2022, 5:50오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/217 "2022-08-01T05:50:55Z")

</div>

[Auto-Linkify Words - #216 by md-misko](https://meta.discourse.org/t/linkify-words-in-post/82193/216?u=md-misko) 링크를 따라 별도의 게시글로 만들었습니다. 이게 버그에 해당하는지 확실하지 않네요:

감시 단어(Watched words)는 유니코드를 지원하지 않으며, 모든 유니코드 문자를 단어 경계로 취급합니다(\b를 사용할 때 발생하며, 이는 예상할 수 있는 부분입니다).

그리고 더 있습니다(감시 단어로 몇 가지 테스트 케이스를 실행해 보니 다음 두 가지가 발견됨):

- 감시 단어 `"\bid\(d+)\b"`는 잘못된 정규식입니다. (사실이지만, 여전히 규칙이 추가됩니다)
- `\bid\s?(\d+)\b → https://example.com/id$1`이 `https://example.com/id%241`로 링크화됩니다(대체 대신 URL 인코딩된 $1이 추가됨)

대체(substitution)가 지원되지 않는 건지, 아니면 버그인 건가요?

---

<div class="post-metadata">

### Author: ![jrgong](https://avatars.discourse-cdn.com/v4/letter/j/c57346/32.png) [@jrgong](https://meta.discourse.org/u/jrgong)
#### Post date: [11월 2, 2022, 6:05오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/218 "2022-11-02T18:05:10Z")

</div>

> [@danekhollas](#):
>
> `|`를 사용할 수 없다는 점이 매우 짜증나죠, 동의합니다.

지금까지 세로선 `|`을 사용할 수 있는 우회 방법을 찾으신 분이 계신가요? 제 정규식 중에는 이 기호가 필수적인 경우가 있습니다.

---

<div class="post-metadata">

### Author: ![danielabc](https://avatars.discourse-cdn.com/v4/letter/d/b9e5f3/32.png) [@danielabc](https://meta.discourse.org/u/danielabc)
#### Post date: [11월 22, 2022, 2:08오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/219 "2022-11-22T14:08:46Z")

</div>

안녕하세요, 이 놀라운 테마를 개발해 주셔서 감사합니다! 정말 마음에 듭니다! 이 테마를 관리자뿐 아니라 모든 사용자가 사용할 수 있도록 출시해 주실 수 있을까요?

[GitHub - renato/discourse-imgify-words: theme to auto imgify urls in discourse, almost the same as discourse-linkify-works](https://github.com/renato/discourse-imgify-words)

---

<div class="post-metadata">

### Author: ![renato](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/renato/32/383632_2.png) [@renato](https://meta.discourse.org/u/renato)
#### Post date: [11월 22, 2022, 2:24오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/220 "2022-11-22T14:24:21Z")

</div>

안녕하세요,

링크하신 이 테마 컴포넌트는 다른 토픽에서 설명하신 필요 사항에 대한 임시 해결책으로 제가 Sam의 컴포넌트를 변형한 것입니다.

이들은 테마 컴포넌트 설정(관리자만 관리 가능)에 따라 게시글에서 해당 단어들이 어떻게 렌더링되는지만 변경하는 단순한 테마 컴포넌트입니다(Sam의 컴포넌트는 특정 단어를 링크로 변환하고, 제 컴포넌트는 특정 단어를 이미지로 변환합니다).

설명하신 기능은 테마 컴포넌트로는 구현할 수 없으며, 데이터베이스에 사용자별 (단어, 이미지 URL) 세트를 저장하는 플러그인이 필요합니다. 또한 단어에서 이미지로의 변환은 게시글(HTML) 콘텐츠를 생성할 때 서버 측에서 수행되어야 합니다. 이러한 작업은 테마 컴포넌트(프론트엔드/클라이언트 측 코드만 포함)에서는 수행할 수 없습니다(이 작업을 위해 누군가를 고용할 경우, 이러한 세부 사항을 이해하는 것이 매우 중요합니다).

이것은 해당 테마 컴포넌트의 범위를 벗어나며 훨씬 더 복잡한 작업이 필요합니다. 해당 기능이 어떻게 동작하기를 원하는지에 대한 세부 사항을 #Marketplace 채널에 게시하고, Discourse 내부 구조에 대한 이전 경험이 있는 개발자를 이곳에서 고용해 도움을 받으시는 것을 제안합니다.

---

<div class="post-metadata">

### Author: ![danielabc](https://avatars.discourse-cdn.com/v4/letter/d/b9e5f3/32.png) [@danielabc](https://meta.discourse.org/u/danielabc)
#### Post date: [11월 22, 2022, 2:28오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/221 "2022-11-22T14:28:38Z")

</div>

알려줘서 고마워. 해당 카테고리에 들어가서 이야기할게.

---

<div class="post-metadata">

### Author: ![davidkingham](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/davidkingham/32/119528_2.png) [@davidkingham](https://meta.discourse.org/u/davidkingham)
#### Post date: [4월 2, 2023, 3:34오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/223 "2023-04-02T03:34:14Z")

</div>

이 주제에서 여러 번 언급되었지만, 한 번 더 확인하고 싶습니다. 특정 카테고리로 제한하거나 카테고리를 제외하는 방법이 있을까요? 초보자 카테고리에 이 기능을 사용해서, 신참들이 알아야 할 기본 용어들에 대한 링크를 모두 표시하고 싶습니다. 하지만 다른 영역에서는 경험 있는 사용자들에게 그냥 성가신 요소가 될 뿐이거든요. 감사합니다!

---

<div class="post-metadata">

### Author: ![hellekin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hellekin/32/51636_2.png) [@hellekin](https://meta.discourse.org/u/hellekin)
#### Post date: [7월 30, 2023, 9:49오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/224 "2023-07-30T09:49:40Z")

</div>

거슬리는 제한 사항 하나를 발견했습니다: 정규 표현식을 사용할 때, $1은 정확히 한 번만 대체됩니다.

### 예시

`/foo-([0-9a-f]+)/,https://target.example/foo/$1/foo-$1`

### 기대 결과

| 키워드 | 링크 |
| --- | --- |
| `foo-abcd` | `https://target.example/foo/abcd/foo-abcd` |

### 실제 결과

| 키워드 | 링크 |
| --- | --- |
| `foo-abcd` | `https://target.example/foo/abcd/foo-$1` |

---

<div class="post-metadata">

### Author: ![Brandon007](https://avatars.discourse-cdn.com/v4/letter/b/b4bc9f/32.png) [@Brandon007](https://meta.discourse.org/u/Brandon007)
#### Post date: [7월 31, 2023, 4:32오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/225 "2023-07-31T04:32:37Z")

</div>

주시 단어가 문제인 이유는, 주시 단어가 게시물에 몇 번 등장하느냐에 따라 그만큼 여러 번 링크가 생성되기 때문입니다. 이 때문에 상황이 엉망이 됩니다.

P.S. 이 문장을 세 번 빠르게 말해 보세요. 😁

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [7월 31, 2023, 11:41오전 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/226 "2023-07-31T11:41:44Z")

</div>

정확히 말하면, 해당 단어는 전체 게시글당 한 번이 아니라 _줄당_ 한 번씩 대체됩니다. 🙂

---

<div class="post-metadata">

### Author: ![Brandon007](https://avatars.discourse-cdn.com/v4/letter/b/b4bc9f/32.png) [@Brandon007](https://meta.discourse.org/u/Brandon007)
#### Post date: [7월 31, 2023, 12:11오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/227 "2023-07-31T12:11:19Z")

</div>

그랬으면 좋겠지만, 내 설치 환경에서는 그렇지 않아. ☹

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [7월 31, 2023, 12:25오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/228 "2023-07-31T12:25:54Z")

</div>

테스트 인스턴스에서 어떻게 작동하는지 보여 드리겠습니다:

 ![image](https://global.discourse-cdn.com/meta/original/4X/3/4/b/34b546d14604a02742a01b8bc74d069d7fea000e.png)

🤔

---

<div class="post-metadata">

### Author: ![Brandon007](https://avatars.discourse-cdn.com/v4/letter/b/b4bc9f/32.png) [@Brandon007](https://meta.discourse.org/u/Brandon007)
#### Post date: [7월 31, 2023, 12:33오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/229 "2023-07-31T12:33:52Z")

</div>

이거 좀 봐…

내 규칙:

 ![Screen Shot 2023-07-31 at 6.32.13 AM](https://global.discourse-cdn.com/meta/original/4X/1/6/4/164e925f563cd0baec6be18daeb9154fe6abd515.png)

결과:

 ![Screen Shot 2023-07-31 at 6.33.03 AM](https://global.discourse-cdn.com/meta/original/4X/e/a/3/ea35e1d6f000c4805df5862ab4eb7811673888b5.png)

---

<div class="post-metadata">

### Author: ![hellekin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hellekin/32/51636_2.png) [@hellekin](https://meta.discourse.org/u/hellekin)
#### Post date: [7월 31, 2023, 1:38오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/230 "2023-07-31T13:38:14Z")

</div>

@Canapin 제 문제를 놓치셨네요: 반복된 단어의 문제가 아니라, 한 단어에 대한 반복 패턴 치환 문제입니다: URL에는 치환할 패턴이 _두 번_ 포함되어 있습니다.

플러그인에서 `/g` 패턴 치환 옵션이 기본값이므로, 치환 문자열의 `$1` _모든_ 발생 위치에 적용되어야 하며, 첫 번째 위치에만 적용되는 것이 아닙니다.

키워드가 문장, 줄, 또는 단락에서 여러 번 나타나는 경우와는 다른 상황입니다. \_치환\_은 선택된 항목의 여러 발생 위치를 고려해야 합니다.

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [7월 31, 2023, 1:51오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/231 "2023-07-31T13:51:28Z")

</div>

저는 링크파이어 워드 컴포넌트에 대해 말씀드린 건지, 감시 중인 단어 기능에 대해 말씀드린 건지 궁금했어요 🙂

@hellekin, 설명해 주셔서 감사합니다 👍

---

<div class="post-metadata">

### Author: ![Brandon007](https://avatars.discourse-cdn.com/v4/letter/b/b4bc9f/32.png) [@Brandon007](https://meta.discourse.org/u/Brandon007)
#### Post date: [7월 31, 2023, 1:53오후 UTC](https://meta.discourse.org/t/auto-linkify-words/82193/232 "2023-07-31T13:53:25Z")

</div>

샘이 말한 감시 단어(watched words)에 대해 답변드리고 있었어요. 😁

linkify는 한 번만 작동한다는 건 알겠는데, 글 하나당 한 번씩 작동하면 좋겠어요. 오늘 한번 직접 시도해 봐야 할 것 같아요. 감시 단어가 매칭을 찾을 때가 되면 참을 수 없을 정도로 귀찮거든요.

[Previous page](https://meta.discourse.org/t/auto-linkify-words/82193.md?page=10)

[Next page](https://meta.discourse.org/t/auto-linkify-words/82193.md?page=12)
