2013-07-19 3 views
0

У меня есть следующий фрагмент кода, который работает: (стандартная текстовая строка)Regex для захвата подстроки между кавычками

($txid) = $content =~ m/ start (.*) stop /; 
print $txid; 

И следующий фрагмент кода, который не делает: (строка с кавычками)

($txid) = $content =~ m/<input name="transactionid" value="(.*)" type="hidden">/; 
print $txid; 

Я предполагаю, что проблема вызвана кавычками. Кто-нибудь знает, как я могу это решить?

+0

Вопрос действительно правдоподобен * not * с кавычками. (a) Не анализируйте HTML с регулярными выражениями, это связано с созданием хрупких решений. (b) Какой вклад у вас есть? Покажите нам пример. – amon

+0

['" Это не работает "'] (http://tlp-perl.blogspot.se/2013/06/its-not-working.html) - не очень хороший способ описать вашу проблему. – TLP

+0

Входной способ является большим, чтобы надеть здесь, это веб-страница HTML. Первый, я только что сделал строку «start hello stop», которая вернула «привет» правильно. Вторая возвращает пустую переменную. Я проверил, и $ content заполнен правильными данными, мне просто нужно захватить значение скрытого поля «transactionid». – user1796225

ответ

0

По умолчанию сумматор * является «жадным», что означает, что (.*) будет соответствовать всем возможностям. Для того, чтобы ограничить его таким образом, чтобы он соответствовал как можно меньше, то есть только до следующей двойной кавычки, что происходит в строке, не добавить ? к нему, таким образом:

($txid) = $content =~ m/<input name="transactionid" value="(.*?)" type="hidden">/; 

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

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

+0

Спасибо, что сработали. – user1796225

+0

@ user1796225 Рад помочь. Тем не менее, предупреждения, которые вам даны об использовании регулярных выражений для анализа HTML, являются результатом совокупных лет ругательства, вытягивания волос и обобщенных страданий, и вам было бы чрезвычайно полезно следовать им. Вы просто уходите отсюда, потому что у вас очень простая проблема; если бы ваше требование было даже немного сложнее, я бы вместо этого дал вам пример HTML :: TreeBuilder. Конечно, вы можете игнорировать этот совет, но вы делаете это на свой страх и риск. –

+0

Нет проблем, я ценю ваш совет. Как вы сказали, это одна простая задача, и это единственный раз, когда мне нужно разбирать HTML во всей части программного обеспечения. В будущем, если я буду разбирать HTML, я буду помнить об этом совете. :-) – user1796225

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