2009-11-27 3 views
0

Я пытаюсь соответствовать значению следующего HTML-сниппет:(рубин) помощь соответствие мое регулярное выражение

<input name="example" type="hidden" value="matchTextHere" /> 

следующим:

x = response.match(/<input name="example" type="hidden" value="^.+$" \/>/)[0] 

почему это не работает? она не совпадает с '' matchTextHere

редактировать:

, когда я использую:

x = response.match(/<input name="example" type="hidden" value="(.+)" \/>/)[0] 

он соответствует весь HTML элемент, а не только значение 'matchTextHere'

ответ

3

^ соответствует началу строки и $ соответствует концу строки. Измените ^.+$ на \w+ и он будет работать для значений, не содержащих символов. Сделайте это скобкой, чтобы зафиксировать значение - (\w+)

Обновление: чтобы соответствовать чему-либо между кавычками (при условии, что в котировке нет никаких котировок) используйте [^"]+. Если в значении есть скрытые кавычки, это другой мяч. .+ будет работать в этом случае, но он будет медленнее из-за возврата. .+ первые совпадения до конца строки (потому что . соответствует даже "), а затем ищет " и терпит неудачу. Затем он возвращается на одну позицию и ищет " и снова сработает - и так далее, пока не найдет " - если после value появился еще один атрибут, вы получите matchTextHere" nextAttr="something в качестве соответствия.

x = response.match(/<input name="example" type="hidden" value="([^"]+)" \/>/)[1] 

При этом регулярное выражение не будет выполнено, если между любыми значениями атрибутов имеется дополнительное пространство. Разбор HTML с регулярным выражением не является хорошей идеей, - и если вы должны использовать регулярное выражение, вы можете разрешить дополнительные пробелы с помощью \s+

/<input\s+name="example"\s+type="hidden"\s+value="([^"]+)"\s*\/>/ 
+0

я должны соответствовать буквы, символы и цифры. в основном мне нужно сопоставить все, что находится между цитатами. – sepiroth

+0

использовать '[^"] + 'для захвата символов – Amarghosh

+0

//возвращает всю строку, а не значение i хочу – sepiroth

0

Потому что у вас есть начало-строки маркера (^) и по окончании срока ($) в вашем регулярном выражении. Я думаю, что вы хотели уловить ценность, это может решить вашу проблему: value="(.+?)".

Остерегайтесь, однако, что обработка html с регулярными выражениями не является хорошей идеей, она может даже drive you crazy. Вместо этого лучше используйте html parser.

0

Вам не нужно^и $:

x = response.match(/<input name="example" type="hidden" value=".+" \/>/)[0] 
0

вам просто нужно изменить [0] на [1]

response='<input name="example" type="hidden" value="matchTextHere" />' 

puts response.match(/<input name="example" type="hidden" value="(.*?)" \/>/)[1] 

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