我仍然不明白正则表达式如何与preg_replace一起使用。我在文中有一些网址:
site.com/user/login.php?valid=tru
site.com/eng/page/some_page.php?valid=tru&anothervar=1
我想改变它,所以它变成了这个
site.com/user/login /
site.com/eng/page/some_page /
preg_replace(" 'no_mater_what_1'.php'no_mater_what_2' " , 'no_mater_what_1'/ , $some_var);
答案 0 :(得分:1)
为避免陷阱,如路径中的其他.php
子字符串,您可以使用此替换:
$url = preg_replace('~\.php(?:[?#]\N*|\z)~i', '', $url, -1, $c);
if (!$c) // not a php file, do something else
或以这种方式:
if (preg_match('~[^?#]+\.php(?=[?#]|\z)~Ai', $url, $m))
$url = $m[0];
else
// not a php file, do something else
这种方式可以确保匹配的.php
是文件的扩展名,因为正则表达式引擎会找到最左边的结果,后跟查询部分的?
,{{1} }对于片段部分或字符串的结尾。
模式元素:
#
:不是换行符的字符。\N
:锚定字符串的结尾。\z
:将模式锚定在字符串开头的修饰符A
:lookahead assertion 这种方法的优点是安全性高,效率高。
parse_url
的另一种方式:
您可以使用(?=...)
将网址分成几部分。如果这种方式有点挑剔,因为你需要在之后重建网址(以及重建它的方式取决于网址中存在的元素),但这远非不可能,提供了一种安全的方式。
答案 1 :(得分:0)
这应该有效
$subject = 'site.com/eng/page/some_page.php?valid=tru&anothervar=1';
if (preg_match('/(.*)\.php(?:\?.*)/', $subject, $regs)) {
$result = $regs[1] .'/';
echo $subject .' => '. $result;
} else {
echo 'NOT FOUND';
}
执行 magic 的正则表达式是
/(.*)\.php(?:\?.*)?/
按部分:
(.*)\.php
捕获所有内容,直至(不包括)“。php”
(?:\?.*)
搜索模式“?...”
?
使最后一个模式可选
答案 2 :(得分:0)
但为什么不这样做呢:
$replace = explode('.php',$some_var);
$replace = $replace[0] . '/';
因为我觉得有必要使用正则表达式,因为字符串中不会重复“.php”。
答案 3 :(得分:0)
因为您的两个示例显示在同一行,所以这看起来有点令人困惑。但是,您似乎想要使用/替换.php到行尾的所有内容。所以,使用:
$new_link = preg_replace('/\.php.*$/', '/', $old_link);
你需要在前面的\。因为。是一个需要转义的特殊字符,使其像句点一样工作。然后,你按顺序查找php,然后在行的末尾查找任何内容($表示行的结尾)。用/.
替换所有这些