正则表达式通过链接替换单词

Anh*_*hTu 3 regex string replace

我想写一个正则表达式,它将用链接替换单词Paris,因为只有单词没有准备好作为链接的一部分.

例:

    i'm living <a href="Paris" atl="Paris link">in Paris</a>, near Paris <a href="gare">Gare du Nord</a>,  i love Paris.
Run Code Online (Sandbox Code Playgroud)

会成为

    i'm living.........near <a href="">Paris</a>..........i love <a href="">Paris</a>.
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 6

这很难一步到位.编写单个正则表达式实际上是不可能的.

尝试两步法.

  1. 无论是否已存在其他链接,请在每个"巴黎"周围添加链接.
  2. 找到所有错误嵌套的链接(<a href="..."><a href="...">Paris</a></a>),并消除内部链接.

第一步的正则表达式很简单:

\bParis\b
Run Code Online (Sandbox Code Playgroud)

第二步的正则表达式稍微复杂一些:

(<a[^>]+>.*?(?!:</a>))<a[^>]+>(Paris)</a>
Run Code Online (Sandbox Code Playgroud)

在整个字符串中使用该字符串并将其替换为匹配组1和2的内容,从而有效地删除多余的内部链接.

用简单的词解释正则表达式#2:

  • 查找每个链接(<a[^>]+>),可选地后跟任何本身不是后跟关闭链接(.*?(?!:</a>))的内容.将其保存到匹配组1中.
  • 现在寻找下一个链接(<a[^>]+>).确保它在那里,但不要保存它.
  • 现在寻找巴黎这个词.将其保存到匹配组2中.
  • 寻找关闭链接(</a>).确保它在那里,但不要保存它.
  • 用第1组和第2组的内容替换所有内容,从而丢失您未保存的所有内容.

该方法假设这些方面条件:

  • 您输入的HTML不会被严重破坏.
  • 你的正则表达式支持非贪婪量词(.*?)和零宽度负前瞻断言((?!:...)).
  • 您只在步骤1中的链接中包含单词"Paris",不包含其他字符.每个" Paris"变为" <a href"...">Paris</a>",否则第二步将失败(直到您更改第二个正则表达式).
  • BTW:正则表达式#2明确允许这样的结构:

    <a href="">in the <b>capital of France</b>, <a href="">Paris</a></a>

    剩余链接来自第一步,第二步的替换结果将是:

    <a href="">in the <b>capital of France</b>, Paris</a>