php preg_match между скобками - PullRequest
       4

php preg_match между скобками

3 голосов
/ 11 октября 2011

я хочу использовать preg_match, чтобы найти текст между скобками, например: $varx = "(xx)";

конечный результат будет $match = 'xx';

другой пример $varx = "bla bla (yy) bla bla";

finalвывод будет примерно таким: $match = 'yy';

, другими словами, он удаляет скобки.Я все еще путаю с регулярным выражением, но обнаружил, что иногда совпадение preg - более простое решение.ищу другой пример, но не отвечаю моим потребностям.

Ответы [ 6 ]

8 голосов
/ 11 октября 2011

Попробуйте что-то вроде этого:

preg_match('/(?<=\()(.+)(?=\))/is', $subject, $match);

Теперь он будет захватывать новые строки.

7 голосов
/ 11 октября 2011

Помните, что квадратные скобки являются специальными символами в RegExps, поэтому вам нужно избегать их с обратной косой чертой - вы также не дали понять, какой возможный диапазон символов может находиться между ( ... ) или может либыть несколько экземпляров ( ... ).

Таким образом, ваша лучшая ставка может быть RegExp вроде: /\(([^\)]*)\)/, который будет соответствовать множеству случаев ( ... ), содержащих любые (или нет) символовмежду скобками.

Попробуйте preg_match('/\(([^\)]*)\)/', $sString, $aMatches)

РЕДАКТИРОВАТЬ: (пример)

<?php
$sString = "This (and) that";
preg_match_all('/\(([^\)]*)\)/', $sString, $aMatches);
echo $aMatches[1][0];
echo "\n\n\n";
print_r($aMatches);
?>

В результате:

and


Array
(
    [0] => Array
        (
            [0] => (and)
        )

    [1] => Array
        (
            [0] => and
        )

)

Итак«и» хранится в $ aMatches [1] [0]:)

3 голосов
/ 11 октября 2011

preg_match('/\((.*?)\)/i', $varx, $match);

Добавление модификатора s допускает разрывы строк между скобками. Например:

bla bla (y
y) bla bla

preg_match('/\((.*?)\)/si', $varx, $match);

Лучшее выражение может быть построено, если содержимое между параэнтезами имеет регулярную структуру. Например, если бы это всегда были двойные буквы, такие как xx или yy, следующее выражение было бы более подходящим.

/\(([a-zA-Z]{2})\)/i

Также, если вы хотите захватить все совпадения в $varx, используйте preg_match_all(). Например:

this (and) that (or) the other

preg_match_all() будет захватывать and и or

Для проверки используйте что-то вроде:

<?php
$varx = "this (and) that (or) the other";
preg_match_all('/\((.*?)\)/si', $varx, $matches);
print_r($matches);
?>

Это покажет, где совпадения в массиве $matches.

2 голосов
/ 06 февраля 2014

Это кажется чище.

$pattern = '/\((.+?)\)/is';
2 голосов
/ 11 октября 2011

Надеюсь, это сработает

preg_match_all('#\(((?>[^()]+)|(?R))*\)#x');

Извините за неполный ответ ..

$preg_match = '#\(((?>[^()]+)|(?R))*\)#x';

$data = 'bla bla (yy) bla bla';

if(preg_match_all($preg_match, $data, $match)) {
    $match = $match[0];
} else {
    $match = array();
}

Надеюсь, что теперь имеет смысл

1 голос
/ 11 октября 2011

Не используйте для этого регулярное выражение, используйте str_replace()

$string = str_replace(array('(', ')'), '', $your_string);
...