这可能是一些愚蠢的正则表达式错误或其他什么,但这里是:
我通过文件列表循环使用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=(.*)\&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> <a href="viewtopic.php?id=100290&p=2">2</a> <a href="viewtopic.php?id=100290&p=3">3</a></p>
答案 0 :(得分:0)
我刚刚修改了你的正则表达式:
我用不合格的.*
替换了这些“卑鄙”贪婪模式.*?
,或者更好地使用[^&]*
这样的模式取代:获取所有内容直到&amp;
~<a href="viewtopic\.php\?id=([^&]*)\&p=([^"]*)">([^<]*)</a>~