在regexp的匹配范围内替换

时间:2014-08-11 13:48:39

标签: php regex

我正在尝试使用我在Word上创建的参考文本。 我有纯文本,其中包含(1)(1,2,5)(1-5)或其组合:(1-5,8,10-15)。我想将数字作为引用的超链接,并将整个部分放在()之间的另一个HTML标记中。

我发现我可以使用正则表达式来匹配括号和带#(\([0-9,\-]*\))#的数字,以及带有([\(,\-]?(\d{2}|\d)[\),\-])的数字,但是如何进行替换以便我的输出就像这个? !(#1#,#2#-#5#)!

非常感谢你!

1 个答案:

答案 0 :(得分:0)

我很抱歉我的神秘描述。

我想做的是,在文章的最后,在我的文章中将每个参考号都作为该参考的链接。引用可以格式化为(1)(1-5)(1,3,5),或组合:(1-3,5,8-10)
我想要的输出是例如(<a href="ref-1">1</a>)等等。

我发现在一次查找和替换中我无法做到这一点,所以我不得不将其分解为两次。 这就是我想出的:

<?php
$input = "Hello, I am a sample text(1). I have references in me(2-5). They can be in a weird, mixed format(1,3,5-8,10,13)";

function references($input) {
    preg_match_all("#\([0-9,\-]*\)#i", $input, $referenties);
    $tekst = preg_split("#\(([0-9,\-]*)\)#i", $input);
    $referenties = preg_replace("#([\d]+)#", "<a href=\"#ref-$1\">$1</a>", $referenties[0]);

    for($i=0; $i < count($tekst)-1 OR $i < count($referenties)-1; $i++) {
        $output.=$tekst[$i].$referenties[$i];
    }

    return $output;
}

echo references($input);
?>

它对我有用。 你对我如何做得更好有什么想法吗?