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中第一个出现的位置。