需要帮助为preg_replace编写正则表达式

时间:2014-04-09 19:23:40

标签: php preg-replace

好吧,我想使用preg_replace从url中提取参数。 现在我有这样的事情:

preg_replace("%(?<=[\?&])$param=.+(&|$)%", '', $url);

但它并没有奏效。问题在于表达的结束。 如何编写可执行以下操作的表达式:&#34; match&amp;字符或字符串的结尾&#34;?

1 个答案:

答案 0 :(得分:2)

我对你的帖子感到有点困惑,因为你说你想要&#34;提取&#34;参数,但是你说你想要使用preg_replace。如果您想要实际提取参数以便处理它们,那么您可能需要preg_match_all。如果想要更换问号及其后面的所有内容,(我认为您正在尝试从示例代码中完成),这很容易实现。像这样的东西会这样做:

$string = 'https://www.google.com/search?q=Metallica+Turn+The+Page&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=sb';

$string = preg_replace('~\?.*~', '', $string);

print $string;

这会查找问号\?,后跟任意字符.,任意次*,然后将其替换为空。这会给你:

https://www.google.com/search

如果你想用某些东西实际替换每个参数,你也可以这样做

// REPLACE ALL OF THE PARAMS WITH DUMMY-PARAM
$string = 'https://www.google.com/search?q=Metallica+Turn+The+Page&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=sb';

$string = preg_replace('~[?&]\K([A-Z0-9+%]+)=.+?(?=&|$)~i', '$1=DUMMY-PARAM', $string);

print "\n\n".$string;

或者

// REPLACE ALL OF THE KEYS WITH DUMMY-KEY
$string = 'https://www.google.com/search?q=Metallica+Turn+The+Page&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=sb';

$string = preg_replace('~[?&]\K[A-Z0-9+%]+=(.+?)(?=&|$)~i', 'DUMMY-KEY=$1', $string);

print "\n\n".$string;

或者

// PULL OUT ALL KEYS/VALUES
$string = 'https://www.google.com/search?q=Metallica+Turn+The+Page&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=sb';

$string = preg_replace('~[?&]\K([A-Z0-9+%]+)=(.+?)(?=&|$)~i', "\n$1: $2", $string);

print "\n\n".$string;

所有这三个都是从一个字符类开始寻找问号或&符号。 \K告诉表达式一旦找到它之前的内容就开始匹配。然后我们查找键,这是一些URL字符的字符类,后跟一个等号,后跟至少一个字符(但可以更多),一直到它到达表达式的下一部分。在这里,我使用.+?来表示,但是使用字符类会更好。类似这样的东西适用于这个表达式:([-.:A-Z0-9+%]+)?。在任何情况下,表达式的下一部分都是先行检查,看看是否会出现&符号或者行的末尾。

Here is a working demo for you to compare the differences

希望能够正确回答您的问题。正如我之前提到的,我对此感到困惑。如果没有,请告诉我,我会重新评估。