preg_replace去除斜杠 - php

我想从网址中删除前导斜杠和查询字符串,但无法弄清楚如何同时使用它们。我有这段代码非常适合剥离查询字符串,但是它留下了斜杠

preg_replace('/\?.*$/', '', $_SERVER['REQUEST_URI'])

如果我的URL是www.mysite.com/myPage?querystring=123,则上面的代码使我留有/myPage。我该如何进行调整,以便也可以删除前导斜线?

另外,您能否指出我一个资源来帮助我理解preg_replace模式匹配?

参考方案

在这种简单的情况下,我可能更喜欢PHP的简单字符串函数而不是regex:

$addr  = ltrim($_SERVER['REQUEST_URI'], '/'); // zap a leading slash
$q_pos = strpos($addr, '?'); // get the string position of a '?'
$addr  = $q_pos !== FALSE ? substr($addr, 0, $q_pos) : $addr; // pull out URI

PHP的strpos()docs返回一个整数值,因此$q_pos === 0可能...这就是我们检查$q_pos !== FALSE的原因。

更新

我想我应该回答这个问题,但是...在这种情况下实际使用正则表达式...

$address = '/test/url/test.php?extra';
$pattern = '{^/?([^\?]+)\?.*$}';
$replace = '$1';
$address = preg_replace($pattern, $replace, $address);
echo "$address"; // outputs: test/url/test.php

这是如何运作的?好吧……我们的模式使用括号指定捕获组([^\?]+),该括号捕获可选的正斜杠/?到字符串中首次出现的可选\?之后的所有内容。请注意,我们用反斜杠转义了实际的问号字符,因为它在正则表达式模式的上下文中具有含义。正则表达式模式.*的最后部分只是将零个或多个字符匹配到字符串的末尾。

最后,我们的替换仅指定$1来引用用原始括号分组([^\?]+)捕获的文本。

要注意的另一件事是,正则表达式的新手通常无法意识到,您不需要使用/作为模式定界符。在这种情况下,我们要匹配实际的正斜杠字符,我会使用其他名称(例如花括号)。

我通常将正则表达式初学者指向this link以帮助他们入门。

更新2

上面的regex假定总会有一个查询字符串,因此,如果您遇到的URI没有一个查询字符串(例如/All-Products),则该regex将不起作用。为了解决这个问题,只需更改您的模式以使查询字符串为可选:

$pattern = '{^/?([^\?]+)(?:\?.*)?$}'; // use an optional non-capturing group

-要么-

$pattern = '{^/?([^\?]+)\??.*$}'; // make the escaped ? optional

PHP:Preg_replace,单词边界和非单词字符 - php

我需要替换文本中以井号(#)开头的单词。好吧,我知道如何替换整个单词。preg_replace("/\b".$variable."\b/", $value, $text);由于该\ b修饰符仅接受单词字符,因此不会替换包含井号的单词。我有这个html,其中包含#companyName类型的变量,我将其替换为一个值。 参…

php:拆分字符串,直到第一次出现数字 - php

我有像cream 100G sup 5mg Children 我想在第一次出现数字之前将其拆分。所以结果应该是array( array('cream','100G'), array('sup','5mg Children') ); 可以告诉我如何为此创建图案吗?我试过了list(…

PHP preg_match直到双行中断 - php

我在mysql字段中有此数据:First text text text text text text text text text text text text text text text text text text text text Second text text text text text text text text text text te…

PHP preg_replace和号 - php

好吧,我可能不会以正确的方式解决这个问题,但是这里就来了。我有这个带链接的字符串,并提取标签之间的文本...$string = $item; $pattern = '/\<a([^>]*)\>([^<]*)\<\/a\>/i'; $replacement = '$2'; $messa…

preg_match不捕获内容 - php

我的preg_match有什么问题?preg_match('numVar("XYZ-(.*)");',$var,$results); 我想从这里获取所有内容:numVar(“ XYZ-CONTENT”);感谢您的任何帮助! 参考方案 我认为这是PHP?如果是这样,则您的代码存在三个问题。PHP的PCRE函数要求使用分隔…