如何将正则表达式数据转换为全局字符串php

时间:2013-08-10 17:07:14

标签: php regex

我有一个类似下面的功能

function addMinus($string){

  $output = str_replace("%20", "-", $string);
  $output = str_replace(" ", "-", $output);

  return $output;

}

我需要在以下函数中使用上面给出的函数

function addgsk($string){

    $regex = '~\(gsk:(.*?)\)~six';
    $link = "$1";
    $link = addMinus($link);
    $output = preg_replace($regex, "<a href='$link'>(gsk:$1)</a>", $string);

   return $output;

}

但我的问题是$link = addMinus($link);不起作用。空格不会被&#34; - &#34;取代。我认为这是因为来自正则表达式的数据。

注意:我没有收到任何错误,但函数(addMinus)不起作用。

3 个答案:

答案 0 :(得分:0)

这不起作用,因为您不能使用$1之类的引用作为仅在preg_replace或preg_replace_callback的替换模式中定义的变量。当您编写$link = "$1";时,未定义引用$1,并且当您调用 addMinus 时,较差的函数会尝试在此文字字符串中查找空格:"$1" < / p>

解决问题的一种方法是使用preg_replace_callback,它允许在替换之前使用函数。请参阅官方文档:http://php.net/manual/en/function.preg-replace-callback.php

答案 1 :(得分:0)

这可能是正则表达式的一个问题,但我们需要先了解您实际想要替换的模式。

无论哪种方式,现在$link在正则表达式发生之前都会为其分配值$1。告诉我这是否有帮助(如果没有,我们可以从那里弄清楚):

function addgsk($string){
    $regex = '~\(gsk:(.*?)\)~six';
    $link = addMinus($string);
    $output = preg_replace($regex, '<a href="' . $link . '">(gsk:$1)</a>', $string);
    return $output;
}

答案 2 :(得分:0)

我不知道你想要哪些数据,

function add_minus_gsk($string) {

    return preg_replace_callback(
        '@\(gsk:([^)]++)\)@i',
        function ($matches) {
            return sprintf(
                '<a href="%s">(gsk:%s)</a>',
                str_replace(array('%20', ' '), '-', $matches[1]),
                $matches[1]
            );
        },
        $string
    );

}

function add_minus_gsk($string) {

    return preg_replace(
        '@\(gsk:([^)]++)\)@i',
        '<a href="$1">(gsk:$1)</a>',
        str_replace(array('%20', ' '), '-', $string)
    );

}

尝试两种方法。