Intereting Posts
Как заставить Selenium работать с PHP / Firefox3 в Linux? API Google: аутентифицировать запрос с помощью OAuth, но без окна согласия пользователя, затем запрашивать данные Google для определенного имени пользователя или идентификатора пользователя Вставка изображения с PHP и FPDF php – simpleXML Как получить доступ к определенному элементу с тем же именем, что и другие? Как преобразовать строку с числами и пробелами в int PHP ограничение на количество вывода, разрешенное до перенаправления местоположения заголовка, отклонено Использование odbc PDO для подключения к экземпляру сервера MSSQL с проверкой подлинности Windows сортировка scandir по дате по убыванию Как проверить, является ли доменное имя CNAME в PHP Проблема с кодировкой запроса php mysql BackboneJS Сделать ID Integer Переименовать Добавить в Корзину Кнопки для Out of Stock Продукты в WooCommerce 3 JQuery форма $ _POST php пуста? – Моя сериализация кажется неудачной Как отправить флажки со всех страниц с помощью jQuery DataTables Перенаправление с PHP после вызова ajax

PHP: лучший способ извлечь текст в круглых скобках?

Каков наилучший / самый эффективный способ извлечения текста между круглыми скобками? Скажем, я хотел получить строку «текст» из строки «игнорировать все, кроме этого (текста)» наиболее эффективным образом.

Пока что лучшее, что я придумал, это:

$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 () =>, который используется для определения положения первого события в строке.