1

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

假设如下:

$search = "classic rock/8"

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

我尝试了几种方法,最后一种方法是通过首先删除斜线后的所有内容来进行三遍。

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

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

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

提前致谢!

4

3 回答 3

3

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

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

$searchValues = explode(" ", $res[0]); //These are the results
于 2013-10-06T16:52:26.470 回答
1

您可以使用strrpos

$search = 'classic rock/8';
$page = substr($search, strrpos($search, '/')+1); // 8
于 2013-10-06T16:52:31.780 回答
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
 )
于 2013-10-07T17:47:12.217 回答