【发布时间】:2014-02-14 05:17:57
【问题描述】:
我正在尝试 regex 匹配 .htaccess 文件内容中的几件事。
基本上所有在 cmets之间
##bbc-startSOME_IP_HERE_AND_SOME_LABEL 和 ##bbc-end
想法是抓取cmets之间的规则,如果存在的话,用空字符串替换:
<IfModule mod_rewrite.c>
RewriteEngine On
##bbc-start-1Mail.RU_Bot
RewriteCond %{REMOTE_HOST} -1 [OR]
RewriteCond %{HTTP_USER_AGENT} Mail.RU_Bot
RewriteRule . - [F]
##bbc-end
##bbc-start66.249.78.150googlebot
RewriteCond %{REMOTE_HOST} 66.249.78.150 [OR]
RewriteCond %{HTTP_USER_AGENT} googlebot
RewriteRule . - [F]
##bbc-end
##bbc-start157.55.33.50bingbot
RewriteCond %{REMOTE_HOST} 157.55.33.50 [OR]
RewriteCond %{HTTP_USER_AGENT} bingbot
RewriteRule . - [F]
##bbc-end
</IfModule>
使用的模式是:
$regex_pattern = "/##bbc-start{$bot_banned_ip}{$bot_banned_mark}(.*?)##bbc-end/m";
...{$bot_banned_ip} 和 {$bot_banned_mark} 在运行时提供。
上面的模式已经过测试并且在http://www.rubular.com/r/bfoeQnah49在线上运行良好
在http://www.regexe.com/ 上,但令人惊讶的是无法在PHP 环境中工作,5.3.18 与preg_match() 或preg_replace()。
我错过了什么,是我的环境有问题吗?
编辑:确切的代码是:
$file_contents = '<IfModule mod_rewrite.c>
RewriteEngine On
##bbc-start-1Mail.RU_Bot
RewriteCond %{REMOTE_HOST} -1 [OR]
RewriteCond %{HTTP_USER_AGENT} Mail.RU_Bot
RewriteRule . - [F]
##bbc-end
##bbc-start66.249.78.150googlebot
RewriteCond %{REMOTE_HOST} 66.249.78.150 [OR]
RewriteCond %{HTTP_USER_AGENT} googlebot
RewriteRule . - [F]
##bbc-end
##bbc-start157.55.33.50bingbot
RewriteCond %{REMOTE_HOST} 157.55.33.50 [OR]
RewriteCond %{HTTP_USER_AGENT} bingbot
RewriteRule . - [F]
##bbc-end
</IfModule>';
$regex_pattern = "/##bbc-start{$bot_banned_ip}{$bot_banned_mark}(.*?)##bbc-end/m";
$match = preg_match($regex_pattern, $file_contents);
//preg_match() returns 1 if the pattern matches given subject, 0 if it does not, or FALSE if an error occurred.
if ($match===1) { /*DO SOME STUFF*/}
奇怪的是$match总是0。
【问题讨论】:
标签: php regex .htaccess preg-match