PHP字符串如何将模式后的部分提取到单独的变量中

时间:2013-10-06 16:44:54

标签: php regex strpos

我有一个收集两条信息的字符串。斜杠之前的所有内容都是搜索变量,之后的所有内容都是页码。

假设如下:

$search = "classic rock/8"

应该是$ searchvalue [0] ='classic $ searchvalue [1] ='rock'$ searchvalue [x] = etc ... 然后$ page = 8

我尝试了几种方法,最后一种方法是首先删除斜线后的所有内容。

$search=substr($search, 0, strpos($search, '/'));

然后将$ search值分成一个数组。 然后返回(第3次!)并通过删除斜杠前的所有内容来获取页面变量。

我知道这是非常低效的。有没有办法一次性完成这些操作?

提前致谢!

3 个答案:

答案 0 :(得分:3)

您可以将该字符串爆炸并获得相同的结果!

$res = explode("/", $search); 
$page = $res[1]; //This is the page

$searchValues = explode(" ", $res[0]); //These are the results

答案 1 :(得分:1)

您可以使用strrpos

$search = 'classic rock/8';
$page = substr($search, strrpos($search, '/')+1); // 8

答案 2 :(得分:0)

为了响应一次通过,您可以使用preg match all功能或
你可以使用preg split功能。

无论哪种方式都有它的缺点,但爆炸和strrpos或其他任何东西也是如此。

很多人没有意识到他们可以用更详细的方式使用preg split 准确地刻出一根绳子。这可以通过详细定义拆分以包括捕获来完成。这种方式有点不同,但如果你学会了怎么做,那就有很大的力量。

正则表达式:

  #  ([^\s\/]+)(?:\s+|$)|\/+\s*(\d+)[\s\/]*$|\/.*$

                       # Delim-1
     ( [^\s\/]+ )      # (1), A group of not whitespace nor forward slash
     (?: \s+ | $ )     # folowed by whitespace or EOL

                       # Delim-2
  |  \/+ \s*           # Forward slashes folowed by whitespaces
     ( \d+ )           # (2), folowed by a group of digits
     [\s\/]* $         # followed by whitespaces or slashes until EOL

                       # Delim-3
  |  \/ .* $           # Forward slash folowed by anything until EOL

PHP代码:

 <?php
 $keywords = preg_split
     ( 
         "/([^\s\/]+)(?:\s+|$)|\/+\s*(\d+)[\s\/]*$|\/.*$/",
         "classic rock/8",
         -1,
         PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE 
     );
 print_r($keywords);
 ?> 

 Result:
 Array
 (
     [0] => classic
     [1] => rock
     [2] => 8
 )