Обнаружение шаблона скобок в строке - PullRequest
0 голосов
/ 29 ноября 2011

Обнаружение шаблона скобок в строке

Это строка (пример между скобками).

или

Thisэто строка (пример в скобках).

Мне нужно разделить обе строки на:

$ text = 'Это строка.';

$ eg = 'пример между круглыми скобками';

Пока у меня есть этот код:

$text = 'This is a line (an example between parenthesis)';
preg_match('/\((.*?)\)/', $text, $match);
print $match[1];

Но он только переносит текст в круглые скобки.Мне также нужен текст за скобками.

Ответы [ 4 ]

3 голосов
/ 29 ноября 2011
$text = 'This is a line (an example between parenthesis)';
preg_match('/(.*)\((.*?)\)(.*)/', $text, $match);
echo "in parenthesis: " . $match[2] . "\n";
echo "before and after: " . $match[1] . $match[3] . "\n";

ОБНОВЛЕНИЕ после уточнения вопроса .. теперь со многими круглыми скобками:

$text = "This is a text (is it?) that contains multiple (example) stuff or (pointless) comments in parenthesis.";
$remainder = preg_replace_callback(
        '/ {0,1}\((.*)\)/U',
        create_function(
            '$match',
            'global $parenthesis; $parenthesis[] = $match[1];'
        ), $text);
echo "remainder text: " . $remainder . "\n";
echo "parenthesis content: " . print_r($parenthesis,1) . "\n";

Результат:

remainder text: This is a text that contains multiple stuff or comments in parenthesis.
parenthesis content: Array
(
    [0] => is it?
    [1] => example
    [2] => pointless
)
1 голос
/ 29 ноября 2011

Вы можете использовать preg_split для этой конкретной задачи.Игнорировать последнее значение массива, если после закрывающей скобки нет текста.

$text = 'This is a line (an example between parenthesis)';
$match = preg_split('/\s*[()]/', $text);
0 голосов
/ 29 ноября 2011

Я думаю, вы можете попробовать это регулярное выражение ([^\(].[^\(]*)(\(\b[^\)]*(.*?)\)):

<?php
$text = 'This is a line (an example between parenthesis)';

preg_match_all('/([^\(].[^\(]*)(\(\b[^\)]*(.*?)\))/', $text, $match);

echo '<pre>';
print_r($match);
echo '<pre>';

$text = 'This is a line(an example between parenthesis)
This is a line (an example between parenthesis)
This is a line (an example between parenthesis)
This is a line (an example between parenthesis) This is a line (an example between parenthesis) This is a line (an example between parenthesis)';

preg_match_all('/([^\(].[^\(]*)(\(\b[^\)]*(.*?)\))/', $text, $match);

echo '<pre>';
print_r($match);
echo '<pre>';
?>

http://codepad.viper -7.com / hSCf2P

0 голосов
/ 29 ноября 2011

Весь текст должен быть в $match[0].Если вы хотите получить текст до и текст после, просто перепишите свое регулярное выражение следующим образом:

/(.*?)\((.*)\)(.*?)/

Тогда.текст перед будет в $match[1] и $match[3].

...