ì ê· ííì, ëë ì ê·ìì 문ìì´ìì í¹ì 문ì ì¡°í©ì 찾기 ìí í¨í´ì
ëë¤. JavaScriptììë ì ê· ííìë ê°ì²´ë¡ì, RegExp
ì exec()
ì test()
ë©ìë를 ì¬ì©í ì ììµëë¤. String
ì match()
, matchAll()
, replace()
, replaceAll()
, search()
, split()
ë©ìëìë í¨ê» ì¬ì©í ì ììµëë¤. ì´ ì¥ììë JavaScriptì ì ê· ííìì ì¤ëª
í©ëë¤.
ì ê· ííìì ë ê°ì§ ë°©ë²ì¼ë¡ ë§ë¤ ì ììµëë¤.
ì ê· ííì 리í°ë´. ë¤ìê³¼ ê°ì´ ì¬ëìë¡ í¨í´ì ê°ì¸ì ìì±í©ëë¤.
ì ê· ííì 리í°ë´ì ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ì¬ ë ì»´íì¼ëë¯ë¡, ë°ë ì¼ì´ ìë í¨í´ì ê²½ì° ë¦¬í°ë´ì ì¬ì©íë©´ ì±ë¥ì´ í¥ìë ì ììµëë¤.
RegExp
ê°ì²´ì ìì±ì í¸ì¶.
const re = new RegExp("ab+c");
ìì±ì í¨ì를 ì¬ì©íë©´ ì ê· ííìì´ ë°íìì ì»´íì¼ë©ëë¤. ë°ë ì ìë í¨í´ì´ë, ì¬ì©ì ì ë ¥ ë± ì¸ë¶ ì¶ì²ìì ê°ì ¸ì¤ë í¨í´ì ê²½ì° ì´ë ê² ì¬ì©íì¸ì.
ì ê· ííì í¨í´ì /abc/
ì²ë¼ ë¨ìí 문ìë¡ êµ¬ì±íê±°ë, /ab+c/
ì /Chapter (\d+)\.\d*/
ì²ë¼ ë¨ìí 문ìì í¹ì 문ìì ì¡°í©ì¼ë¡ 구ì±í ìë ììµëë¤. í¹í (\d+)
ì ëíë ê´í¸ë ì ê· ííììì ê¸°ìµ ì¥ì¹ì²ë¼ ì°ì¬ì, ê´í¸ì ì쪽 í¨í´ê³¼ ì¼ì¹í ë¶ë¶ì ëì¤ì ì¬ì©í ì ìëë¡ ê¸°ìµí©ëë¤. 그룹 ì¬ì©í기ìì ë ììë³´ì¸ì.
ë¨ì í¨í´ì 문ìì´ì ìë ê·¸ëë¡ íìí ë ì¬ì©í©ëë¤. ì를 ë¤ì´, /abc/
í¨í´ì 문ìì´ìì ì íí ììë¡ "abc"
ë¼ë 문ìì ì¡°í©ì´ ëíëë ë¶ë¶ê³¼ ì¼ì¹í©ëë¤. ê·¸ë¬ë¯ë¡ ì´ í¨í´ì "Hi, do you know your abc's?"
ì "The latest airplane designs evolved from slabcraft."
ë 문ìì´ìì ì¼ì¹ì ì±ê³µíê³ , ì¼ì¹íë ë¶ë¶ì "abc"
ì¼ ê²ì
ëë¤. ë°ë©´ "Grab crab"
ììë ì¼ì¹íì§ ìëë°, ì´ ë¬¸ìì´ì ë¶ë¶ 문ìì´ë¡ "ab c"
를 í¬í¨í긴 íì§ë§, ì ííê² "abc"
를 í¬í¨íì§ë ì기 ë문ì
ëë¤.
íë ì´ìì "b"를 ì°¾ëë¤ê±°ë 공백 문ì를 ì°¾ë ë± ì§ì ì ì¸ ì¼ì¹ ì´ìì íìì´ íìí ë í¹ì 문ì를 ì¬ì©í©ëë¤. ì컨ë "íëì "a"
ì´íì 0ê° ì´ìì "b"
, ê·¸ ë¤ì "c"
"ì ì¼ì¹í´ì¼ íë©´ /ab*c/
í¨í´ì ì¬ì©í ì ììµëë¤. "b"
ë¤ì *
ë "ì´ì í목ì 0ë² ì´ì ë°ë³µ"ì ì미í©ëë¤. ì´ í¨í´ì 문ìì´ "cbbabbbbcdebc"
ì ëí´ ì¬ì©íë©´, ì¼ì¹íë ë¶ë¶ 문ìì´ì "abbbbc"
ì¼ ê²ì
ëë¤.
ìëì 문ìë¤ìì ê°ê°ì ë²ì£¼ì ìíë ë¤ìí í¹ì 문ìì 목ë¡ê³¼ ì¤ëª , ìì 를 ì°¾ìë³¼ ì ììµëë¤.
ì´ìì ìë ì¤ì´ë ë¨ì´ì ììê³¼ ëì ëíë´ë ê²½ê³ì, ì¼ì¹ê° ê°ë¥í ë°©ë²ì ëíë´ë í¨í´(ì ë°©íì, íë°©íì, ì¡°ê±´ ííì ë±)ì´ í¬í¨ë©ëë¤.
ê¸ìì ì«ìì²ë¼ ë¤ë¥¸ ì íì 문ì를 구ë¶í©ëë¤.
íí 문ìì 그룹과 ë²ì를 ëíë ëë¤.
ì¼ì¹í 문ìë ííì´ ë°ë³µëì´ì¼ í íì를 ëíë ëë¤.
ë/ì문ì, ìí 기í¸, ë¬¸ì¥ ë¶í¸ì²ë¼, ì ëì½ë 문ì ìì±ì ë°ë¼ 문ì를 구ë¶í©ëë¤.
ìë íë ì ê· ííììì ì¬ì©íë 모ë í¹ì문ìì 목ë¡ì ëë¤.
ì ê· ííì í¹ì문ì 문ì / ì¡°í© ë¬¸ì\
, .
, \cX
, \d
, \D
, \f
, \n
, \r
, \s
, \S
, \t
, \v
, \w
, \W
, \0
, \xhh
, \uhhhh
, \uhhhhh
, [\b]
^
, $
, x(?=y)
, x(?!y)
, (?<=y)x
, (?<!y)x
, \b
, \B
(x)
, (?:x)
, (?<Name>x)
, x|y
, [xyz]
, [^xyz]
, \Number
*
, +
, ?
, x{n}
, x{n,}
, x{n,m}
\p{UnicodeProperty}
, \P{UnicodeProperty}
ì ëì½ë ìì± ì´ì¤ì¼ì´í
ì°¸ê³ : ì 문ìì ì¼ë¶ë§ ë°ì·í´ ì 리í´ëì, ë í° ì¹í¸ ìí¸ë ììµëë¤.
ì´ì¤ì¼ì´íí¹ì 문ì를 ìë ê·¸ëë¡ íì("*"
ì ì§ì ì°¾ë ë±)í´ì¼ íë ê²½ì°, í¹ì 문ì ìì ìì¬ëì(\)를 ë°°ì¹í´ì ì´ì¤ì¼ì´í í´ì¼ í©ëë¤. ì를 ë¤ì´ "a"
ë¤ì ë³í("*"
) ë¤ì "b"
ì ì¼ì¹í´ì¼ íë©´ /a\*b/
를 ì¬ì©íë©´ ë©ëë¤. ìì¬ëìê° "*"
를 "ì´ì¤ì¼ì´í"í´ì, í¹ì 문ìê° ìë 문ì 리í°ë´ë¡ ì·¨ê¸í©ëë¤.
ë§ì°¬ê°ì§ë¡, ì¬ëì(/)ì ì¼ì¹í´ì¼ íë ê²½ì°ìë ì´ì¤ì¼ì´í를 í´ì¼ í©ëë¤. ê·¸ë¥ ë¹ê¸ì ì¬ì©íë©´ í¨í´ì´ ëëë²ë¦½ëë¤. ì를 ë¤ì´ 문ìì´ "/example/"ê³¼ ê·¸ ë¤ íë ì´ìì ìíë²³ì ì°¾ì¼ë ¤ë©´ /\/example\/[a-z]/
를 ì¬ì©í ì ììµëë¤. ê°ê°ì ì¬ëì ìì ëì¸ ìì¬ëìê° ì¬ëì를 ì´ì¤ì¼ì´íí©ëë¤.
리í°ë´ ìì¬ëìì ì¼ì¹íë ¤ë©´ ìì¬ëì를 ì´ì¤ì¼ì´íí©ëë¤. "A:\", "B:\", "C:\", ..., "Z:\"ì ì¼ì¹íë í¨í´ì /[A-Z]:\\/
ì
ëë¤. ìì ìì¬ëìê° ë¤ì ìì¬ëì를 ì´ì¤ì¼ì´íí´ì, ê²°ê³¼ì ì¼ë¡ íëì 리í°ë´ ìì¬ëìì ì¼ì¹íê² ë©ëë¤.
RegExp
ìì±ìì 문ìì´ ë¦¬í°ë´ì ì¬ì©íë ê²½ì°, ìì¬ëìê° ë¬¸ìì´ ë¦¬í°ë´ì ì´ì¤ì¼ì´íë¡ë ìëíë¤ë ê²ì 기ìµí´ì¼ í©ëë¤. ê·¸ë¬ë¯ë¡ ì ê· ííìì ìì¬ëì를 ëíë´ë ¤ë©´ 문ìì´ ë¦¬í°ë´ ìì¤ì ì´ì¤ì¼ì´íë í´ì¤ì¼ í©ëë¤. ì¦, ìì ì´í´ë³¸ /a\*b/
í¨í´ì ìì±íë ¤ë©´ new RegExp("a\\*b")
ê° ëì´ì¼ í©ëë¤.
ì´ì¤ì¼ì´í ëì§ ìì 문ìì´ì ì´ë¯¸ ê°ì§ê³ ìì ë String.replace
를 íì©í´ ì´ì¤ì¼ì´í를 í´ì¤ ì ììµëë¤.
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $&ì ì¼ì¹í 문ìì´ ì 체를 ì미
}
ì ê· ííì ë¤ì "g"ë ì ì²´ 문ìì´ì íìí´ì 모ë ì¼ì¹ë¥¼ ë°ííëë¡ ì§ì íë ì ì íì íëê·¸ì ëë¤. íëê·¸ì ëí´ìë ìëì íë그를 íì©í ê³ ê¸ íììì íì¸í ì ììµëë¤.
"ì escapeRegExp()
ê° JavaScriptì ì¼ë¶ê° ìëê°ì?" ê´ë ¨ ì ìì ììì¼ë TC39ê° ê±°ë¶íìµëë¤.
ì ê· ííìì ì무 ë¶ë¶ì´ë ê´í¸ë¡ ê°ì¸ê² ëë©´, ê·¸ ë¶ë¶ê³¼ ì¼ì¹íë ë¶ë¶ 문ìì´ì 기ìµíê² ë©ëë¤. 기ìµí ë¶ë¶ 문ìì´ì ë¶ë¬ìì ë¤ì ì¬ì©í ì ììµëë¤. 그룹과 ë²ì 문ììì ìì¸í ììë³´ì¸ì.
JavaScriptìì ì ê· ííì ì¬ì©í기ì ê· ííìì RegExp
ì ë©ìë test()
ì exec()
, String
ì ë©ìë match()
, replace()
, search()
, split()
ìì ì¬ì©í ì ììµëë¤.
exec()
문ìì´ìì ì¼ì¹íë ë¶ë¶ì íìí©ëë¤. ì¼ì¹ ì 보를 ëíë´ë ë°°ì´, ëë ì¼ì¹ê° ìë ê²½ì° null
ì ë°íí©ëë¤. test()
문ìì´ì ì¼ì¹íë ë¶ë¶ì´ ìëì§ íì¸í©ëë¤. true
ëë false
를 ë°íí©ëë¤. match()
ìº¡ì² ê·¸ë£¹ì í¬í¨í´ì 모ë ì¼ì¹ë¥¼ ë´ì ë°°ì´ì ë°íí©ëë¤. ì¼ì¹ê° ìì¼ë©´ null
ì ë°íí©ëë¤. matchAll()
ìº¡ì² ê·¸ë£¹ì í¬í¨í´ì 모ë ì¼ì¹ë¥¼ ë´ì ë°ë³µê¸°ë¥¼ ë°íí©ëë¤. search()
문ìì´ìì ì¼ì¹íë ë¶ë¶ì íìí©ëë¤. ì¼ì¹íë ë¶ë¶ì ì¸ë±ì¤, ëë ì¼ì¹ê° ìë ê²½ì° -1
ì ë°íí©ëë¤. replace()
문ìì´ìì ì¼ì¹íë ë¶ë¶ì íìíê³ , ê·¸ ë¶ë¶ì ëì²´ 문ìì´ë¡ ë°ê¿ëë¤. replaceAll()
문ìì´ìì ì¼ì¹íë ë¶ë¶ì 모ë íìíê³ , 모ë ëì²´ 문ìì´ë¡ ë°ê¿ëë¤. split()
ì ê· ííì ëë 문ìì´ ë¦¬í°ë´ì ì¬ì©í´ì 문ìì´ì ë¶ë¶ 문ìì´ì ë°°ì´ë¡ ëëëë¤.
문ìì´ ë´ë¶ì í¨í´ê³¼ ì¼ì¹íë ë¶ë¶ì´ ì¡´ì¬íëì§ë§ ììë´ë ¤ë©´ test()
ë search()
ë©ìë를 ì¬ì©íì¸ì. ë ë리ëë¼ë ì¼ì¹ì ê´í ì¶ê° ì ë³´ê° íìíë©´ exec()
ê³¼ match()
ë©ìë를 ì¬ì©íì¸ì. ì¼ì¹íë ë¶ë¶ì´ ì¡´ì¬íë©´, exec()
ê³¼ match()
ë ì¼ì¹ì ê´í ë°ì´í°ë¥¼ í¬í¨í ë°°ì´ì ë°ííê³ , ì¼ì¹ì ì¬ì©í ì ê· ííì ê°ì²´ì ìì±ì ì
ë°ì´í¸í©ëë¤. ì¼ì¹íì§ ëª»í ê²½ì° null
ì ë°íí©ëë¤. (null
ì ì¡°ê±´ íê° ì false
ì ê°ìµëë¤)
ìëì ìì ììë, 문ìì´ìì ì¼ì¹íë ë¶ë¶ì 찾기 ìí´ exec()
ë©ìë를 ì¬ì©í©ëë¤.
const myRe = /d(b+)d/g;
const myArray = myRe.exec("cdbbdbsbz");
ë§ì½ ì ê· ííì ê°ì²´ì ìì±ì ì ê·¼í íìê° ìì¼ë©´ ìëì ê°ì´ ì§§ê² ì¸ ìë ììµëë¤.
const myArray = /d(b+)d/g.exec("cdbbdbsbz");
// 'cdbbdbsbz'.match(/d(b+)d/g); ì ë¹ì·íì§ë§,
// 'cdbbdbsbz'.match(/d(b+)d/g)ì ë°í ê°ì [ 'dbbd' ]ì¸ ë°ë©´
// /d(b+)d/g.exec('cdbbdbsbz')ì ë°í ê°ì [ 'dbbd', 'bb', index: 1, input: 'cdbbdbsbz' ]
(ìëì exec()
ê³¼ ì ì íì íëê·¸ ì¬ì©í기ìì ëì ë°©ìì ì°¨ì´ì ëí´ ë ììë³´ì¸ì)
ì ê· ííìì 문ìì´ìì ë§ë¤ê³ ì¶ì¼ë©´ ìëì²ë¼ ì¬ì©í ìë ììµëë¤.
const myRe = new RegExp("d(b+)d", "g");
const myArray = myRe.exec("cdbbdbsbz");
ìëì íë ì ì¤í¬ë¦½í¸ìì ì¼ì¹ë¥¼ ì±ê³µí í, ë°ííë ë°°ì´ê³¼ ì ë°ì´í¸ëë ì ê· ííì ê°ì²´ì ìì±ì ëë¤.
ì ê· ííì ì¤í ê²°ê³¼ ê°ì²´ ìì± ëë ì¸ë±ì¤ ì¤ëª ì ìì ììì ê°myArray
ì¼ì¹í 문ìì´ ë° ê¸°ìµí 모ë ë¶ë¶ 문ìì´. ['dbbd', 'bb', index: 1, input: 'cdbbdbsbz']
index
ì¼ì¹í ë¶ë¶ì´ 주ì´ì§ 문ìì´ìì ìì¹í ì¸ë±ì¤. (0ë¶í° ìì) 1
input
주ì´ì§ ì본 문ìì´. 'cdbbdbsbz'
[0]
ë§ì§ë§ì¼ë¡ ì¼ì¹í ë¶ë¶ 문ìì´. 'dbbd'
myRe
lastIndex
ë¤ì ì¼ì¹ë¥¼ ììí ì¸ë±ì¤. (g ìµì
ì ì§ì í ì ê· ííìì ê²½ì°ìë§ ì¤ì ë©ëë¤. íë그를 íì©í ê³ ê¸ íìì ì°¸ê³ íì¸ì) 5
source
í¨í´ì í
ì¤í¸. ì ê· ííìì´ ìì±ë ë ê°±ì ë©ëë¤. ì¤í ìì ìë ê°±ì ëì§ ììµëë¤. 'd(b+)d'
ì ìì ì ë ë²ì§¸ ííì²ë¼, ì ê· ííì ê°ì²´ë¥¼ ë³ìì ëì íì§ ìê³ ë ì¬ì©í ì ììµëë¤. íì§ë§, ì´ë¬ë©´ 매 ì¬ì©ë§ë¤ ì ê· ííì ê°ì²´ê° ìë¡ ìì±ëë©°, ì ë°ì´í¸ëë ìì±ì ì ê·¼í ì ììµëë¤. ë¤ìê³¼ ê°ì ì½ë를 ìê°í´ë³´ê² ìµëë¤.
const myRe = /d(b+)d/g;
const myArray = myRe.exec("cdbbdbsbz");
console.log(`lastIndexì ê°ì ${myRe.lastIndex}`);
// "lastIndexì ê°ì 5"
ê·¸ë¬ë ìì ì½ë ëì ìë ì½ë를 ì¬ì©íê² ëë©´...
const myArray = /d(b+)d/g.exec("cdbbdbsbz");
console.log(`lastIndexì ê°ì ${/d(b+)d/g.lastIndex}`);
// "lastIndexì ê°ì 0"
ë ê°ì /d(b+)d/g
ë ìë¡ ë¤ë¥¸ ì ê· ííì ê°ì²´ì´ë¯ë¡ ë³ê°ì lastIndex
ìì±ì ê°ìµëë¤. ì ê· ííì ê°ì²´ì ìì±ì ì ê·¼í´ì¼ íë©´, ì°ì ë³ìì í ë¹íì¸ì.
ì ê· ííìì ì ì íìì´ë ëì문ì 무ìì ê°ì í¹ì±ì ì§ì íë íë그를 ê°ì§ ì ììµëë¤. íëê·¸ë ë¨ë ì¼ë¡ ì¬ì©í ìë ìê³ , ììì ìê´ ìì´ í꺼ë²ì ì¬ë¿ì ì§ì í ìë ììµëë¤.
íëê·¸ë ë¤ìê³¼ ê°ì 구문ì¼ë¡ ì ê· ííìì ì§ì í ì ììµëë¤.
const re = /pattern/flags;
ìì±ì를 ì¬ì©í ê²½ì° ì´ë ê² ì§ì í©ëë¤.
const re = new RegExp("pattern", "flags");
íëê·¸ë ì ê·ìê³¼ ìì í í©ì³ì§ë¯ë¡ ëì¤ì ì¶ê°íê±°ë ì ê±°í ì ììµëë¤.
ì를 ë¤ì´, re = /\w+\s/g
ë í ê° ì´ìì ê¸ìì ê·¸ ë¤ì 공백 íë를, 문ìì´ ì ì²´ì ëí´ íìí©ëë¤.
const re = /\w+\s/g;
const str = "fee fi fo fum";
const myArray = str.match(re);
console.log(myArray);
// ["fee ", "fi ", "fo "]
ìë ì½ëë...
ì´ë ê² ìì±ì를 ì¬ì©íëë¡ ë°ê¿ ìë ììµëë¤.
const re = new RegExp("\\w+\\s", "g");
ë 구문 모ë ëì¼í 결과를 ë³ìµëë¤.
m
íëê·¸ë ì¬ë¬ ì¤ì ê±¸ì¹ ì
ë ¥ 문ìì´ì ì¬ë¬ ì¤ë¡ ì·¨ê¸íê² í©ëë¤. ë¬ë¦¬ ë§í´, m
íë그를 ì§ì í ê²½ì°, ^
ì $
ë ê°ê° ì ì²´ ì
ë ¥ 문ìì´ì ììê³¼ ëì´ ìëë¼, ê° ì¤ì ììê³¼ ëì ëìíê² ë©ëë¤.
RegExp.prototype.exec()
ë©ìëì g
íë그를 ì¬ì©íë©´, ì¼ì¹í ë¶ë¶ 문ìì´ë¤ê³¼ ê°ê°ì ì¸ë±ì¤ë¥¼ íëì© ìì°¨ì ì¼ë¡ ë°íí©ëë¤.
const str = "fee fi fo fum";
const re = /\w+\s/g;
console.log(re.exec(str)); // ["fee ", index: 0, input: "fee fi fo fum"]
console.log(re.exec(str)); // ["fi ", index: 4, input: "fee fi fo fum"]
console.log(re.exec(str)); // ["fo ", index: 7, input: "fee fi fo fum"]
console.log(re.exec(str)); // null
ë°ë©´, String.prototype.match()
ë©ìëë 모ë ì¼ì¹ë¥¼ í ë²ì ë°ííì§ë§, ê°ê°ì ì¸ë±ì¤ë í¬í¨íì§ ììµëë¤.
console.log(str.match(re)); // ["fee ", "fi ", "fo "]
ìì
ì°¸ê³ : ë¤ì 문ìììë ì ê· ííìì ì¬ì© ìì 를 ë³¼ ì ììµëë¤.
exec()
, test()
, match()
, matchAll()
, search()
, replace()
, split()
ë©ìë 참조ìë ìì ììë ì¬ì©ìê° ì íë²í¸ë¥¼ ì ë ¥í´ì¼ í©ëë¤. ì¬ì©ìê° "íì¸" ë²í¼ì ë르면 ì ë ¥í ê°ì ì¤í¬ë¦½í¸ë¡ ê²ì¦í©ëë¤. ê°ì´ ì í¨íë©´, ì¦ ì ê· ííìê³¼ ì¼ì¹íë 문ìì ìíì¤ë¥¼ ë°ìì¼ë©´, ì¤í¬ë¦½í¸ë ê°ì¬ ë©ìì§ë¥¼ ì¶ë ¥í©ëë¤. ê°ì´ ì í¨íì§ ìì¼ë©´, ì¬ì©ììê² ì¬ë°ë¥´ì§ ìì ê°ìì ìë ¤ì¤ëë¤.
ì ê· ííìì 구조ë ë¤ìê³¼ ê°ìµëë¤.
^
)(?:)
)ì¼ë¡, 1ì ë¤ë¥¼ ìë ì¸ ê°ì ì«ì(\d{3}
), ëë(|
), ì¬ë ê´í¸(\(
)ì ë¤ë¥¼ ìë ì¸ ê°ì ì«ì(\d{3}
)ì ë¤ë¥¼ ìë ë«ë ê´í¸(\)
)()
)ì¼ë¡, 2ì ë¤ë¥¼ ìë íëì ëì, ì¬ëì, ëë ë§ì¹¨í\d{4}
)\1
)\d{4}
)$
)<p>
ì íë²í¸ë¥¼ ì
ë ¥ í "íì¸" ë²í¼ì ë르ì¸ì.
<br />
###-####-####ì íìì¼ë¡ ì
ë ¥íì¸ì.
</p>
<form id="form">
<input id="phone" />
<button type="submit">íì¸</button>
</form>
<p id="output"></p>
JavaScript
const form = document.querySelector("#form");
const input = document.querySelector("#phone");
const output = document.querySelector("#output");
const re = /^(?:\d{3}|\(\d{3}\))([-\/\.])\d{4}\1\d{4}$/;
function testInfo(phoneInput) {
const ok = re.exec(phoneInput.value);
if (!ok) {
output.textContent = `íìì ë§ì§ ìë ì íë²í¸ì
ëë¤. (${phoneInput.value})`;
} else {
output.textContent = `ê°ì¬í©ëë¤. ì íë²í¸ë ${ok[0]} ì
ëë¤.`;
}
}
form.addEventListener("submit", (event) => {
event.preventDefault();
testInfo(input);
});
ê²°ê³¼ ë구
ì ê· ííìì ë°°ì°ê³ , ë§ë¤ê³ , ìíí ì ìë ì¨ë¼ì¸ ë구ì ëë¤.
ì ê· ííì ìì±ê¸°/ëë²ê±°ì ëë¤.
ìê°ì ì ê· ííì í ì¤í°ì ëë¤.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4