在括号之间提取文本集的最佳/最有效方法是什么?假设我想以最有效的方式从字符串"忽略除此(文本)之外的所有内容"中获取字符串"text".
到目前为止,我提出的最好的是:
$fullString = "ignore everything except this (text)"; $start = strpos('(', $fullString); $end = strlen($fullString) - strpos(')', $fullString); $shortString = substr($fullString, $start, $end);
有一个更好的方法吗?我知道通常使用正则表达式往往效率较低,但除非我可以减少函数调用的数量,否则这可能是最好的方法吗?思考?
我只是做一个正则表达式并完成它.除非你做了足够的迭代以致它成为一个巨大的性能问题,它只是更容易编码(并且当你回顾它时理解)
$text = 'ignore everything except this (text)'; preg_match('#\((.*?)\)#', $text, $match); print $match[1];
所以,实际上,你发布的代码不起作用:substr()'s
参数是$ string,$ start和$ length,strpos()'s
参数是$haystack
,$needle
.略有修改:
$str = "ignore everything except this (text)"; $start = strpos($str, '('); $end = strpos($str, ')', $start + 1); $length = $end - $start; $result = substr($str, $start + 1, $length - 1);
一些细微之处:我$start + 1
在offset参数中使用以帮助PHP strpos()
在第二个括号上进行搜索时输出; 我们递增$start
一个并减少$length
以从匹配中排除括号.
此外,此代码中没有错误检查:在执行之前,您需要确保$start
并且$end
不要=== false substr
.
至于使用strpos/substr
与正则表达式; 在性能方面,这段代码将击败正则表达式.虽然这有点讽刺.我吃饭和呼吸strpos/substr
,所以我不太介意,但其他人可能更喜欢正则表达式的紧凑性.
使用正则表达式:
if( preg_match( '!\(([^\)]+)\)!', $text, $match ) ) $text = $match[1];