是否可以子字符串到字符串中的下一个空格?
Is it possible to substring to the next whitespace in a string?
如果输入的文本值包含单词的开头,我会尝试突出显示单词的剩余部分。例如,我们有一个字符串“Nutrition is great!”,如果用户输入“Nutr”,那么我希望突出显示“Nutrition”。我在这方面遇到了很多困难,想知道是否有可能将子字符串转换为下一个可用的空格?或者,如果有人可以给我任何关于 different/better 方法的指示。
我从 This post 中得到了一些启发,但不幸的是,它与我想要的全词不匹配。
我创建了一个沙箱来演示我的示例,您会注意到,如果您输入“Nutr”,只有 2 个选项会突出显示,而所有 3 个选项都应该突出显示吗?
嗯,首先您需要更改字符串并将两者输入为小写或大写,以便在相同的基础上对两者进行比较。其余一切都很好,您可以使用 .includes() 方法进行检查,并且可以使用 .trim() 方法 trim 您的字符串,因为这样只能突出显示所需的单词。
比较必须基于字符串是大写还是小写,这样我们就可以 select 文本字符串,而不管是大写还是小写。
更新:
此外,我们还需要 select 仅基于匹配项而不是 span
中文本的全长。
更新的代码沙盒: https://codesandbox.io/s/highlighting-z216x
获取特定文本更新以动态工作的逻辑。
useEffect() Result.js
中的代码更改
useEffect(() => {
console.log(searchTerm);
if (titleRef.current) {
let resultsText = titleRef.current.textContent.toUpperCase();
const index = resultsText.toUpperCase().indexOf(searchTerm);
const text = resultsText.substr(index, resultsText.length).split(" ")[0];
if (index >= 0) {
resultsText =
resultsText.substring(0, index) +
"<span>" +
text +
"</span>" +
resultsText.substring(index + text.length);
titleRef.current.innerHTML = resultsText;
}
}
}, []);
而在 App.js
中,我们需要确保将 searchTerm
作为大写字母传递 props
<Result
text="This is nutritional value"
searchTerm={searchTerm.toUpperCase()}
/>
你有一些其他人已经指出的关于 upper/lower 案例的问题。您还在句子末尾加入了句号,这不太可能是您的本意。
此解决方案不需要更改输入的大小写或任何内容。
我想提供一种使用正则表达式和字符串对象中的 .match()
方法的更简单的方法。
这将允许不区分大小写的匹配,同时只突出显示单词。在下面的代码中,您将看到匹配的搜索词放入 HTML 中,只需调用 .replace()
添加 <span>
标签。
匹配是根据找到键入的字符然后找到单词边界(您在问题中提到的space)来完成的。
if (titleRef.current) {
let resultsText = titleRef.current.innerHTML;
const regex = new RegExp("(?=" + searchTerm + ")\w*", "i");
const found = resultsText.match(regex);
if (found) {
titleRef.current.innerHTML = resultsText.replace(found[0],`<span>${found[0]}</span>`);
}
}
还有 1 个问题。如果搜索不再匹配(假设您键入 'nutrdddd',原始匹配项仍会突出显示。因此,为了解决这个问题,您需要删除 span 标签,我会把它留给您。
希望这对您有所帮助。这是 CodeSandBox
如果输入的文本值包含单词的开头,我会尝试突出显示单词的剩余部分。例如,我们有一个字符串“Nutrition is great!”,如果用户输入“Nutr”,那么我希望突出显示“Nutrition”。我在这方面遇到了很多困难,想知道是否有可能将子字符串转换为下一个可用的空格?或者,如果有人可以给我任何关于 different/better 方法的指示。
我从 This post 中得到了一些启发,但不幸的是,它与我想要的全词不匹配。
我创建了一个沙箱来演示我的示例,您会注意到,如果您输入“Nutr”,只有 2 个选项会突出显示,而所有 3 个选项都应该突出显示吗?
嗯,首先您需要更改字符串并将两者输入为小写或大写,以便在相同的基础上对两者进行比较。其余一切都很好,您可以使用 .includes() 方法进行检查,并且可以使用 .trim() 方法 trim 您的字符串,因为这样只能突出显示所需的单词。
比较必须基于字符串是大写还是小写,这样我们就可以 select 文本字符串,而不管是大写还是小写。
更新:
此外,我们还需要 select 仅基于匹配项而不是 span
中文本的全长。
更新的代码沙盒: https://codesandbox.io/s/highlighting-z216x
获取特定文本更新以动态工作的逻辑。
useEffect() Result.js
useEffect(() => {
console.log(searchTerm);
if (titleRef.current) {
let resultsText = titleRef.current.textContent.toUpperCase();
const index = resultsText.toUpperCase().indexOf(searchTerm);
const text = resultsText.substr(index, resultsText.length).split(" ")[0];
if (index >= 0) {
resultsText =
resultsText.substring(0, index) +
"<span>" +
text +
"</span>" +
resultsText.substring(index + text.length);
titleRef.current.innerHTML = resultsText;
}
}
}, []);
而在 App.js
中,我们需要确保将 searchTerm
作为大写字母传递 props
<Result
text="This is nutritional value"
searchTerm={searchTerm.toUpperCase()}
/>
你有一些其他人已经指出的关于 upper/lower 案例的问题。您还在句子末尾加入了句号,这不太可能是您的本意。
此解决方案不需要更改输入的大小写或任何内容。
我想提供一种使用正则表达式和字符串对象中的 .match()
方法的更简单的方法。
这将允许不区分大小写的匹配,同时只突出显示单词。在下面的代码中,您将看到匹配的搜索词放入 HTML 中,只需调用 .replace()
添加 <span>
标签。
匹配是根据找到键入的字符然后找到单词边界(您在问题中提到的space)来完成的。
if (titleRef.current) {
let resultsText = titleRef.current.innerHTML;
const regex = new RegExp("(?=" + searchTerm + ")\w*", "i");
const found = resultsText.match(regex);
if (found) {
titleRef.current.innerHTML = resultsText.replace(found[0],`<span>${found[0]}</span>`);
}
}
还有 1 个问题。如果搜索不再匹配(假设您键入 'nutrdddd',原始匹配项仍会突出显示。因此,为了解决这个问题,您需要删除 span 标签,我会把它留给您。
希望这对您有所帮助。这是 CodeSandBox