【问题标题】:Regex Replace "aaa.bbb.ccc" to "aaa/bbb/ccc.htm"正则表达式将“aaa.bbb.ccc”替换为“aaa/bbb/ccc.htm”
【发布时间】:2012-05-19 14:18:51
【问题描述】:

原文:

<tag keywords="testpage.page11" index="0">Good</tag>

目标文本:

<a href="testpage/page11.htm">Good</a>  

如何编写正则表达式?

到目前为止我所拥有的:

匹配表达式:&lt;tag keywords=\"(.+?)\" index="\d+"&gt;(.*?)&lt;/tag&gt;

替换表达式:&lt;a href="\1.htm"&gt;\2&lt;/a&gt;

但问题是,如何将"testpage.page11" 替换为"testpage/page11.htm"

我应该如何更新我的表达方式?

"aaa.bbb.ccc"部分也可能是"abc.asd.dff.sssdf.sdfafda""a.b",项的长度或项的数量不固定。

另一件事是我必须在一个正则表达式中完成所有替换操作。

【问题讨论】:

  • 我看不出如何在一个正则表达式中完成所有替换。
  • 您使用什么语言和/或实用程序来使用正则表达式执行替换?
  • 你没有提到你想用什么语言来做这个,但是如果是 PHP 可能值得看看 php.net/manual/en/…> 函数。
  • 无论哪种情况,您都需要更换两次。一个执行基本的结构更改,另一个将. 更改为/。您可以通过将替换作为函数调用将其放入单个调用中,但无论如何它将是两个替换。

标签: regex replace match


【解决方案1】:

您要匹配的 Rexex 是这样的:

/<tag keywords="([^"]+)" index="\d+">([^<]+)</tag>/

这显然不能在 single 替换中被替换,但您可以使用像 preg_replace_callback 这样的函数在一个函数调用中执行此操作。

这里我提供一个 PHP 代码来替换您的原始文本:

$str = '<tag keywords="foo.bar.testpage.page11" index="0">Good</tag>';
$link = preg_replace_callback('#<tag keywords="([^"]+)" index="\d+">([^<]+)</tag>#i',
  create_function('$m',
    'return "<a href=\"" . str_replace(".", "/", $m[1]) . ".htm\">".$m[2]."</a>";'),
           $str);
echo $link . "\n";

输出

<a href="foo/bar/testpage/page11.htm">Good</a>

【讨论】:

  • 但这仅适用于单个点->斜线替换。 OP 希望替换任意数量的点。
  • @TimPietzcker:是的,我可能忽略了多个dot-&gt;slash 转换要求。显然,这在一个替换电话中是不可能的。实际的解决方案可能类似于 preg_replace_callback。
  • 对。 (可以使用 .NET 正则表达式(“在末尾添加 .htm”位除外。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2012-01-26
相关资源
最近更新 更多