Каков наилучший / самый эффективный способ извлечения текста между круглыми скобками? Скажем, я хотел получить строку «текст» из строки «игнорировать все, кроме этого (текста)» наиболее эффективным образом.
Пока что лучшее, что я придумал, это:
$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 = "игнорировать все, кроме этого (текст)"; $ start = strpos ($ str, '('); $ end = strpos ($ str, ')', $ start + 1); $ length = $ end - $ start; $ result = substr ($ str, $ start + 1, $ length - 1);
Некоторые тонкости: я использовал $start + 1
в параметре offset, чтобы помочь PHP выходить, выполняя поиск strpos()
во второй круглой скобке; мы увеличиваем $start
one и уменьшаем $length
чтобы исключить круглые скобки из совпадения.
Кроме того, в этом коде отсутствует проверка ошибок: вы должны убедиться, что $start
и $end
не === false перед выполнением substr
.
Что касается использования strpos/substr
и regex; по производительности, этот код будет бить обычным выражением рук. Тем не менее, это немного словнее. Я ем и дышу strpos/substr
, поэтому я не против этого слишком много, но кто-то другой может предпочесть компактность регулярного выражения.
Используйте регулярное выражение:
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); }
в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 ("hello [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" }
Эта функция может быть полезна.
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 () =>, который используется для поиска позиции первого события в строке.
strrpos () =>, который используется для определения положения первого события в строке.