PHP:在括号内提取文本的最佳方法?

在括号之间提取文本集的最好/最有效的方法是什么? 假设我想以最有效的方式从string“忽略除此(文本)以外的所有内容”中得到string“text”。

到目前为止,我所提出的最好的是:

$fullString = "ignore everything except this (text)"; $start = strpos('(', $fullString); $end = strlen($fullString) - strpos(')', $fullString); $shortString = substr($fullString, $start, $end); 

有一个更好的方法吗? 我知道一般来说,使用正则expression式往往效率较低,但除非我能减less函数调用次数,否则这可能是最好的方法? 思考?

我只是做一个正则expression式,并与之结束。 除非你做了足够多的迭代,否则它会成为一个巨大的性能问题,只是更容易编码(并且当你回顾它的时候就明白了)

 $text = 'ignore everything except this (text)'; preg_match('#\((.*?)\)#', $text, $match); print $match[1]; 

所以,实际上,你发布的代码是行不通的: substr()'s参数是$ string,$ start和$ length ,而strpos()'s参数是$haystack$needle 。 稍作修改:

  $ str =“忽略除(this)之外的所有内容”;
 $ start = strpos($ str,'(');
 $ end = strpos($ str,')',$ start + 1);
 $ length = $ end  -  $ start;
 $ result = substr($ str,$ start + 1,$ length  -  1); 

一些微妙之处:我在offset参数中使用了$start + 1 ,以便在第二个括号上执行strpos()search时帮助PHP出来。 我们增加$start一个,并减less$length来排除比较中的括号。

另外,在这段代码中没有错误检查:在执行substr之前,你需要确保$start$end不要=== false。

至于使用strpos/substr与正则expression式; 在性能方面,这个代码将会击败正则expression式。 这是一个有点话语,但。 我吃和呼吸strpos/substr ,所以我不介意太多,但其他人可能更喜欢正则expression式的紧凑性。

使用正则expression式:

 if( preg_match( '!\(([^\)]+)\)!', $text, $match ) ) $text = $match[1]; 

这是一个示例代码来提取'['和']'之间的所有文本,并将其存储2个单独的数组(即一个数组中的括号内的文本和另一个数组中的括号外的文本)

  function extract_text($string) { $text_outside=array(); $text_inside=array(); $t=""; for($i=0;$i<strlen($string);$i++) { if($string[$i]=='[') { $text_outside[]=$t; $t=""; $t1=""; $i++; while($string[$i]!=']') { $t1.=$string[$i]; $i++; } $text_inside[] = $t1; } else { if($string[$i]!=']') $t.=$string[$i]; else { continue; } } } if($t!="") $text_outside[]=$t; var_dump($text_outside); echo "\n\n"; var_dump($text_inside); } 

输出:extract_text(“你好吗?”); 会产生:

 array(1) { [0]=> string(18) "hello how are you?" } array(0) { } 

extract_text(“你好[http://www.google.com/test.mp3]你好吗?”); 会产生

 array(2) { [0]=> string(6) "hello " [1]=> string(13) " how are you?" } array(1) { [0]=> string(30) "http://www.google.com/test.mp3" } 

这个function可能是有用的。

  public static function getStringBetween($str,$from,$to, $withFromAndTo = false) { $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str)); if ($withFromAndTo) return $from . substr($sub,0, strrpos($sub,$to)) . $to; else return substr($sub,0, strrpos($sub,$to)); } $inputString = "ignore everything except this (text)"; $outputString = getStringBetween($inputString, '(', ')')); echo $outputString; //output will be test $outputString = getStringBetween($inputString, '(', ')', true)); echo $outputString; //output will be (test) 

strpos()=>它用来查找string中第一个出现的位置。

strrpos()=>用于查找string中第一个出现的位置。