【问题标题】:Regular Expression change text between tags正则表达式更改标签之间的文本
【发布时间】:2011-09-30 15:10:33
【问题描述】:

我在以下布局中有一些代码,我正在使用 textcrawler 进行查找和替换

<a>
Name=LineA
epsium
ask
answer
line=10
color=red
</a>

<a>
Name=LineB
Color=Blue
</a>

...

现在的问题是我需要使用什么正则表达式来删除&lt;a&gt; and &lt;/a&gt;之间的第二个代码块

【问题讨论】:

  • 您能告诉我们您的尝试吗?
  • 我试过 (.*) 但它选择了整个东西
  • 为什么第二段代码比第一段更重要? &lt;a&gt;.*?&lt;/a&gt; 获得第一个块。而且你不需要括号。
  • 我想用其他东西替换第二个 blaock,所以我认为我需要使用括号来捕获
  • 哦,然后是这样的:&lt;a&gt;(\s*Name=LineB.*?)&lt;/a&gt;&lt;a&gt;(\s*Name=LineB[\S\s]*?)&lt;/a&gt; ?

标签: regex replace html-content-extraction


【解决方案1】:
<a>(\s*?Name\=LineB[\S\s]*?)</a>

它捕获所有以 Name=LineB 开头的 &lt;a&gt;&lt;/a&gt; 标签之间的文本。

【讨论】:

  • 我认为你正朝着正确的方向前进,除了我无法匹配/硬编码字符数,我想在标签之间捕获名称 LineB
  • 那么@sln 是对的:&lt;a&gt;(\s*Name\=LineB.*?)&lt;/a&gt; 应该匹配第二个块。
  • 试过了,还是抓不到块:(
【解决方案2】:

在 Perl 中,我会这样做:

$str =~ s~^(.*?<a>.*?</a>.*?)<a>.*?</a>(.*)$~${1}New text$2~s;

第一组包含第二块 &lt;a&gt;&lt;/a&gt; 之前的所有内容,第二组包含之后的所有内容。

在php中:

$str = preg_replace('~^(.*?<a>.*?</a>.*?)<a>.*?</a>(.*)$~', "${1}New text$2", $str);

【讨论】:

  • 谢谢,一切都很好,但我不确定“TextCrawler”是使用 Perl 还是 php
  • @ThinkingCap:我不知道 TextCrawler,但尝试使用搜索中的正则表达式和替换字段中的 ${1}New text$2
  • +1 或 s~^(.*?&lt;a&gt;.*?&lt;/a&gt;.*?&lt;a&gt;).*?(&lt;/a&gt;.*)$~${1}New a body text$2~s 如果只是替换之间的文本。
【解决方案3】:
preg_replace("/<body>([\s\S]*.*)<\/body>/",$replace,$origional);

这将替换正文标签之间的全部内容。

【讨论】: