【问题标题】:Extracting between two words from Multiline textarea从多行文本区域中提取两个单词
【发布时间】:2019-06-21 15:58:56
【问题描述】:

在创建主题页面上,我有一个部分由代码填充的文本区域。 confidential 标签之间的所有内容都由这段代码添加。

There is some text in the message!


[confidential]
{sitedetails}

Site URL: example.com
Site Username: test
Site Password: test

FTP URL: ftp.domain.com
FTP Username: test
FTP Password: test

Optional Information: Just some text for testing purposes!

{/sitedetails}
[/confidential]

在同一页面上运行此代码:

var $editor = $(".markItUpEditor");
var curValue = $editor.val();
var sdCheck = curValue;
var sdAnalyze = /{sitedetails}([\S\s]*?){\/sitedetails}/gm
var newSD = sdCheck.replace(sdAnalyze,"{sitedetails}\n\n" + inputValues + "\n\n{/sitedetails}");
//alert(newSD);
$editor.val(newSD);

这基本上用新的站点详细信息替换了站点详细信息。 inputValues 在此处不可见,但它们包含站点详细信息并且正在运行。

上面的代码也可以很容易地修改,通过更改这一行来删除站点详细信息:

var newSD = sdCheck.replace(sdAnalyze,"{sitedetails}\n\n" + inputValues + "\n\n{/sitedetails}");

var newSD = sdCheck.replace(sdAnalyze,"");

但是如何修改代码以保留{sitedetails}{/sitedetails} 之间的所有内容。

这应该返回:

Site URL: example.com
Site Username: test
Site Password: test

FTP URL: ftp.domain.com
FTP Username: test
FTP Password: test

Optional Information: Just some text for testing purposes!

如果可能的话,我怎样才能走得更远,只保持在Site URL:Site Username:之间

这应该返回:

example.com

【问题讨论】:

  • 出于好奇,这些都是键/值对。为什么不使用简单的对象而不是所有(非常昂贵的)字符串解析来填充文本区域?或者,至少考虑字符串模板文字。
  • @RandyCasburn 我正在修改我们网页上的现有扩展,但实际上并未触及核心文件。所以我创建了一个带有输入的创建主题页面的新选项卡。现在通常这些输入将通过扩展添加,但我不通过核心文件,因此必须将它们添加到 textarea 中。我给出的第一个代码是如何在输入新细节时更新文本区域。说到你所说的:using a simple object我可以举个例子吗?因为我不知道你的意思。这可能就是我进行字符串解析的原因。
  • 看来我不明白你的困境。您说:机密标签之间的所有内容都由此代码添加。 - 如果是这种情况,则在该代码中您拥有实现目标所需的一切。但我的经验是,如果有人更喜欢 RegEx,他们会竭尽全力确保解决方案是 RegEx。我不认为我可以在这里增加价值。

标签: javascript


【解决方案1】:

这样

var re = /{sitedetails}([\S\s]*?){\/sitedetails}/gm,
 urlRe = /Site URL:(.*)\n/
 
var str = $(".editor").val(), newStr = re.exec(str);
newStr = newStr ? newStr[1].trim() : "";
console.log(newStr)

if (newStr) {
  var url = newStr.match(urlRe);
  if (url) url = url[1].trim();
  console.log("URL:",url)
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<textarea class="editor" rows="10">There is some text in the message!


[confidential]
{sitedetails}

Site URL: example.com
Site Username: test
Site Password: test

FTP URL: ftp.domain.com
FTP Username: test
FTP Password: test

Optional Information: Just some text for testing purposes!

{/sitedetails}
[/confidential]</textarea>

【讨论】:

  • 你又来救我了。非常感谢这段代码。然而,这个问题并不完全正确。由于今天早些时候发生了一些变化(对于其他阅读本文的人:mplungjan 今天早些时候帮助我提供了一个很好的解决方案),但经过一些修改,它可以完美运行!再次感谢您!
  • 我更新了标签之间的修剪字符串
  • 更新为包含 URL。我之前没有阅读完整的问题
【解决方案2】:

好吧,据我所知,我可能是错的,您想提取给定字符串上 Site URL: 和 Site Username: 之间的所有内容,并可能将其存储到变量中,然后您可以从这样串起来:

sdCheck.split(/(Site URL:|Site Username:)/g)[Math.round((sdCheck.split(/(Site URL:|Site Username:)/g).length - 1) / 2)].trim();

这样你就可以得到它。那里做了什么:

  1. 使用正则表达式将字符串拆分为数组。这样你总是会得到一个奇数长度的数组。

  2. 用 Math.round 和除法选择数组的中间位置。

  3. 删除空格的修剪。

此逻辑仅在字符串中只有一个 Site URL: 和 Site Username: 匹配时才有效,但可以针对其他场景进行转换。

片段:

var textarea = document.getElementById('textarea'); 

extract();

function extract() {
  var text = textarea.value;
  document.getElementById('result').innerHTML = text.split(/(Site URL:|Site Username:)/g)[Math.round((text.split(/(Site URL:|Site Username:)/g).length - 1) / 2)].trim();
}

textarea.addEventListener('keyup', function() {
  extract();
});
<textarea id="textarea" style="height: 200px; display: inline-block">
There is some text in the message!


[confidential]
{sitedetails}

Site URL: example.com
Site Username: test
Site Password: test

FTP URL: ftp.domain.com
FTP Username: test
FTP Password: test

Optional Information: Just some text for testing purposes!

{/sitedetails}
[/confidential]
</textarea>

<div id="result" style="display: inline-block; vertical-align: top">

</div>

【讨论】:

  • 你能在我的代码中展示它吗?因为我不知道把你的线放在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多