preg_replace删除而不是替换

时间:2013-12-30 10:51:58

标签: php regex file preg-replace

这可能是一些愚蠢的正则表达式错误或其他什么,但这里是:

我通过文件列表循环使用PHP并替换部分文本,部分使用str_replace,部分使用preg_replace。我有一系列要替换的项目数组及其替换(或替换模式)。但是,对于只有一个正则表达式替换,它直接删除要替换的文本的所有实例,除了它正确替换的最后一个。

这是我的正则数组。只有最后一个元素才有这个问题;其他人在所有情况下都取而代之。

// List of offending links or scripts that have variable values that need regexes to be properly removed
$offenders_regex = array(
    array( '~<a href="viewforum\.php\?id=(.*)">(.*)</a>~', '$2' ), // Replace links to certain sections with just the name of that section
    array( '~<a href="viewtopic\.php\?pid=(.*)#p(.*)">~', '<a href="#p$1">' ), // Replace links to posts with same-page anchors
    array( '~<a href="search\.php\?action=show_user\&user_id=(.*)">Posts</a>~', 'Posts' ), // Remove link to all posts by a user
    array( '~<a href="viewtopic\.php\?id=(.*)\&amp;p=(.*)">(.*)</a>~', '<a href="page-$2.html">$3</a>' ), // Replace links to other pages of a topic with the proper link
);

以下是我用来遍历文件的代码:

foreach( $list as $file ){
    $file_text = preg_replace( '~\R~u', "\r\n", stripslashes( file_get_contents( $file ) ) );
    if ($file_text!=FALSE) {
        foreach( $offenders_replace as $cur_replace ){
            $file_text = str_replace( $cur_replace[0], $cur_replace[1], $file_text );
        }
        foreach( $offenders_regex as $cur_regex ){
            $file_text = preg_replace( $cur_regex[0], $cur_regex[1], $file_text, -1, $count );
        }
        $e = file_put_contents( $file, $file_text );
        if ($e == FALSE){
            echo "Unable to write to " . $file . ".<br/>";
        }
        else echo "Wrote successfully to " . $file . ".<br/>";
    }
    else {
        if (!is_dir($file)) echo "Unable to write to " . $file . ".<br/>";
    }
}

正则表达式应该运行和替换的文本是:

<p class="pagelink conl">Pages: <strong>1</strong>&nbsp;<a href="viewtopic.php?id=100290&amp;p=2">2</a>&nbsp;<a href="viewtopic.php?id=100290&amp;p=3">3</a></p>

1 个答案:

答案 0 :(得分:0)

我刚刚修改了你的正则表达式:

  • 我用不合格的.*替换了这些“卑鄙”贪婪模式.*?,或者更好地使用[^&]*这样的模式取代:获取所有内容直到&amp;

    ~<a href="viewtopic\.php\?id=([^&]*)\&amp;p=([^"]*)">([^<]*)</a>~
    

Working DEMO