在preg_replace中编写正则表达式

时间:2014-12-08 20:09:30

标签: php preg-replace

我仍然不明白正则表达式如何与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);

4 个答案:

答案 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,然后在行的末尾查找任何内容($表示行的结尾)。用/.

替换所有这些