diff --git a/wax-prosemirror-components/src/components/findAndReplace/helpers.js b/wax-prosemirror-components/src/components/findAndReplace/helpers.js index 3860959bc1553df32b014a4cbc2f0dc34053feef..88c373fec3bed0d535be2d4a171f2d40d5015b5f 100644 --- a/wax-prosemirror-components/src/components/findAndReplace/helpers.js +++ b/wax-prosemirror-components/src/components/findAndReplace/helpers.js @@ -37,7 +37,7 @@ const findMatches = (doc, searchValue, matchCase) => { } }); mergedTextNodes.forEach(({ text, pos }) => { - const search = RegExp(searchValue, matchCase ? 'gu' : 'gui'); + const search = RegExp(escapeRegExp(searchValue), matchCase ? 'gu' : 'gui'); let m; // eslint-disable-next-line no-cond-assign while ((m = search.exec(text))) { @@ -54,6 +54,10 @@ const findMatches = (doc, searchValue, matchCase) => { return results; }; +const escapeRegExp = string => { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +}; + const getMatchesByView = (views, searchValue, matchCase) => { let allResults = 0; each(views, (singleView, viewId) => { diff --git a/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js b/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js index 3eafc64377729d445f34d4c76e60d6c01d5eee67..403d392932c4e2901aae2b0ef8081354e384e407 100644 --- a/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js +++ b/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js @@ -42,7 +42,7 @@ const findMatches = (doc, searchValue) => { } }); mergedTextNodes.forEach(({ text, pos }) => { - const search = RegExp(searchValue, matchCase ? 'gu' : 'gui'); + const search = RegExp(escapeRegExp(searchValue), matchCase ? 'gu' : 'gui'); let m; // eslint-disable-next-line no-cond-assign while ((m = search.exec(text))) { @@ -59,6 +59,10 @@ const findMatches = (doc, searchValue) => { return results; }; +const escapeRegExp = string => { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +}; + export default props => { return new Plugin({ key: findAndReplacePlugin,