2009-06-07 1 views
8

У меня возникли проблемы с написанием регулярного выражения (подходящего для PHP preg_match()), которое будет анализировать пары keyword = 'value' независимо от того, является ли значение < > строка заключена в одинарные или двойные кавычки. IOW в обоих случаях мне нужно, чтобы получить < имя > и < значение > где < значение > строка может содержать тип, не ограждающую цитат:Нужно регулярное выражение для синтаксического разбора ключевого слова = 'значение' с одинарными или двойными кавычками

name="value" 
name='value' 

ответ

14

В Perl это регулярное выражение, должно сработать. Сначала он соответствует началу строки, а затем соответствует одному или нескольким символам без символов и устанавливает их в 1 доллар. Затем он ищет = то в в унтер скобки с выбором соответствия для «или" и устанавливает, что $ 2.

/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/ 

Если вы хотели, чтобы соответствовать пустые выражения типа.

Это =» "

Заменить последние два + с * в противном случае это должно работать

Редактировать Как уже упоминалось в комментариях. Дуг использовал ...

/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/ 

Это будет соответствовать одному необязательному пробелу на эфире конца ввода или значения, и он удалил маркер конца строки.

+2

он будет соответствовать имени = 'asd' с двойной кавычкой в ​​и, это неверно. –

+1

Больше не соответствует не совпадающим наборам котировок. – Copas

+0

argh! Вы обновили его до моего ответа: P –

4
/^(\w+?)=(['"])(\w+?)\2$/ 

Что поместит ключ в $1 и значение в $3.

1

Несколько лет поздно, но так как этот вопрос очень занимает на Google, и ответы не удовлетворяли мои потребности, вот еще expression:

(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2 

Это будет соответствовать одинарные или двойные кавычки, принимая во экранированные кавычки, а также некотируемые значения.

name = bar 
name = "bar" 
name = 'bar' 
name = "\"ba\"r\"" 

У него, однако, есть ограничение в том, что если значение отсутствует, считывается ключ из следующей пары ключ/значение. Это можно решить, используя пары ключей/значений comma separated list.

Смежные вопросы