正则表达式将“aaa.bbb.ccc”替换为“aaa / bbb / ccc.htm”

时间:2012-05-19 14:18:51

标签: regex replace match

原文:

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

目标文字:

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

如何编写正则表达式?

到目前为止我所拥有的:

匹配表达式:<tag keywords=\"(.+?)\" index="\d+">(.*?)</tag>

替换表达式:<a href="\1.htm">\2</a>

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

我应该如何更新表达式?

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

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

1 个答案:

答案 0 :(得分:0)

你想要匹配的Rexex是这样的:

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

这显然无法在替换中替换,但您可以使用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>