Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Хитрая регулярка


Автор: DmbITpo 23.1.2012, 18:19
Здравствуйте. Столкнулся с задачей написания регулярки. Но никак не получается корректно выполнить. Всё близко, близко да не то. Может кто поможет. условие такое:
Надо из строк типа 
{g text="hello words" prefix="title"}
{g text="hello "new" words" prefix="title"}
{g text="hello mine's "new"words" prefix="title"}
{g text="hello my words"}
{g text="hello my "words""}

вытащить всё, что находится между text="..." (т.е. получить ...).
Но учесть, что внутри кавычек могут быть другие кавычки...

Может есть какие варианты?

заранее спасибо!

Автор: $дмитрий 23.1.2012, 22:02
А в prefix могут быть кавычки? Какие-то еще ключи бывают кроме text и prefix?

Автор: DmbITpo 24.1.2012, 11:11
Цитата($дмитрий @ 23.1.2012,  22:02)
А в prefix могут быть кавычки? Какие-то еще ключи бывают кроме text и prefix?

в префиксе кавычек быть не может. Но кроме префикса могут быть ещё любые другие аргументы...

Автор: $дмитрий 24.1.2012, 13:28
Цитата

Но учесть, что внутри кавычек могут быть другие кавычки...

Вот в этом вся проблема

Раздели задачу на 2 этапа
1. Обрезай все ключи кроме text
2. Получай текстовое описание, таким образом "#text=\"(.+)"\#"

Автор: Nigel 25.1.2012, 02:06
как-то так
Код

$string = <<<EOD
{g text="hello words" prefix="title"}
{g text="hello "new" words" prefix="title"}
{g text="hello mine's "new"words" prefix="title"}
{g text="hello my words"}
{g text="hello my "words""}
EOD;

$pattern = '~g[^\s]*\s(?:text=\"(.+)\"(?=\s\w+=\".*\"))|(?:text=\"(.+)\")~';

preg_match_all($pattern, $string, $matches);

var_dump($matches);

пустые строчки, надеюсь, сам сможешь убрать.

Автор: ksnk 25.1.2012, 08:29
DmbITpo, а что нужно-то? выковырять значение атрибута text или получить комплект всех атрибутов тега G? В значение атрибута может встретится символ '='? Значение атрибута обязательно заключено в кавычки?

Если нужно только закавыченное значение text, и = в значении не бывает то такая регулярка будет короче, чем у Nigel
Код

$pattern = '~text="([^=}]+)?"\s*(?:\w|})~';


 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)